Вопрос

У меня есть несколько классов в моем приложении, у всех из которых есть 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top