LINQ отличается от одного класса сравнения (и интерфейса)
-
14-10-2019 - |
Вопрос
У меня есть несколько классов в моем приложении, у всех из которых есть Name
свойство, которое я хочу использовать в качестве основы для сравнения (Distinct()
, так далее.). Поскольку я всегда буду сравнивать Name
, Я решил извлечь интерфейс, ISomeComparedStuff
, который просто имеет Name
Propery, что все мои другие классы реализуют. Я установил класс сравнения как таковой:
public class MyComparer : IEqualityComparer<ISomeComparedStuff>
{
public bool Equals(ISomeComparedStuff x, ISomeComparedStuff y)
{
return x.Name == y.Name;
}
public int GetHashCode(ISomeComparedStuff obj)
{
return obj.Name.GetHashCode();
}
}
Единственная проблема в том, когда я пытаюсь кодировать против этого:
public class SomeStuff : ISomeComparedStuff
{
...
}
public class SomeMoreStuff : ISomeComparedStuff
{
...
}
var someStuff = GetSomeStuff().Distinct(new MyComparer);
var someMoreStuff = GetSomeMoreStuff().Distinct(new MyComparer);
Я получаю ошибку актерского состава (SomeStuff
к ISomeComparedStuff
) Есть ли способ сделать это, поэтому мне нужен только один класс сравнения, иначе мне придется создать один для каждого из моих классов (хотя я всегда собираюсь сравнивать на Name
)?
Примечание: я понимаю этот вопрос «Название» нуждается в помощи. Любые предложения были бы великолепны.
Решение
Не уверен, что это хорошее решение или нет, но как насчет того, чтобы сделать MyComparer общим классом?
public class MyComparer<T> : IEqualityComparer<T>
where T: ISomeComparedStuff
{
public bool Equals(T x, T y)
{
return x.Name == y.Name;
}
public int GetHashCode(T obj)
{
return obj.Name.GetHashCode();
}
}
Недостатком является то, что вы должны познакомить подходящую версию:
var someStuff = GetSomeStuff().Distinct(new MyComparer<SomeStuff>());
var someMoreStuff = GetSomeMoreStuff().Distinct(new MyComparer<SomeMoreStuff>());
Расширяясь немного, вы также можете сделать новый метод расширения, подобный этому:
public static IEnumerable<T> DistinctByName<T>(this IEnumerable<T> values)
where T: ISomeComparedStuff
{
return values.Distinct(new MyComparer<T>());
}
Другие советы
Может быть, что -то вроде:
var someStuff = GetSomeStuff().Cast<ISomeComparedStuff>().Distinct(new MyComparer);
Или используйте негенерический IEqualityComparer
.