Нет, вы не можете добавлять конструкторы (даже с методами расширения).
Предполагая, что у вас есть какой-то волшебный способ перейти от Func<T,T,int>
к IEqualityComparer<T>
(мне было бы интересно почитать это сообщение в блоге, если вы можете его процитировать) - тогда самое близкое, что вы можете сделать, это что-то вроде
public static class HashSet {
public static HashSet<T> Create<T>(Func<T, T, int> func) {
IEqualityComparer<T> comparer = YourMagicFunction(func);
return new HashSet<T>(comparer);
}
}
Тем не менее, Я сомневаюсь, что вы можете сделать с лямбда для равенства ... у вас есть две концепции, чтобы выразить: хеширование и истинное равенство. Как будет выглядеть ваша лямбда? Если вы пытаетесь отложить до дочерних свойств, то, возможно, Func<T,TValue>
, чтобы выбрать свойство, и использовать EqualityComparer<TValue>.Default
внутренне ... что-то вроде:
class Person {
public string Name { get; set; }
static void Main() {
HashSet<Person> people = HashSetHelper<Person>.Create(p => p.Name);
people.Add(new Person { Name = "Fred" });
people.Add(new Person { Name = "Jo" });
people.Add(new Person { Name = "Fred" });
Console.WriteLine(people.Count);
}
}
public static class HashSetHelper<T> {
class Wrapper<TValue> : IEqualityComparer<T> {
private readonly Func<T, TValue> func;
private readonly IEqualityComparer<TValue> comparer;
public Wrapper(Func<T, TValue> func,
IEqualityComparer<TValue> comparer) {
this.func = func;
this.comparer = comparer ?? EqualityComparer<TValue>.Default;
}
public bool Equals(T x, T y) {
return comparer.Equals(func(x), func(y));
}
public int GetHashCode(T obj) {
return comparer.GetHashCode(func(obj));
}
}
public static HashSet<T> Create<TValue>(Func<T, TValue> func) {
return new HashSet<T>(new Wrapper<TValue>(func, null));
}
public static HashSet<T> Create<TValue>(Func<T, TValue> func,
IEqualityComparer<TValue> comparer)
{
return new HashSet<T>(new Wrapper<TValue>(func, comparer));
}
}