Оберните делегата в IEqualityComparer - PullRequest
125 голосов
/ 19 сентября 2008

Несколько функций Linq.Enumerable принимают IEqualityComparer<T>. Есть ли удобный класс-оболочка, который адаптирует delegate(T,T)=>bool для реализации IEqualityComparer<T>? Это достаточно просто написать (если вы игнорируете проблемы с определением правильного хеш-кода), но я хотел бы знать, есть ли готовое решение.

В частности, я хочу выполнить операции над множествами Dictionary s, используя только ключи для определения членства (при сохранении значений в соответствии с другими правилами).

Ответы [ 13 ]

1 голос
/ 29 июня 2010

Всего одна оптимизация: Мы можем использовать готовый EqualityComparer для сравнения значений, а не делегировать его.

Это также сделало бы реализацию чище, поскольку реальная логика сравнения теперь остается в GetHashCode () и Equals (), которые вы, возможно, уже перегружены.

Вот код:

public class MyComparer<T> : IEqualityComparer<T> 
{ 
  public bool Equals(T x, T y) 
  { 
    return EqualityComparer<T>.Default.Equals(x, y); 
  } 

  public int GetHashCode(T obj) 
  { 
    return obj.GetHashCode(); 
  } 
} 

Не забудьте перегрузить методы GetHashCode () и Equals () для вашего объекта.

Этот пост помог мне: c # сравнить два общих значения

Sushil

0 голосов
/ 30 мая 2011
public static Dictionary<TKey, TValue> Distinct<TKey, TValue>(this IEnumerable<TValue> items, Func<TValue, TKey> selector)
  {
     Dictionary<TKey, TValue> result = null;
     ICollection collection = items as ICollection;
     if (collection != null)
        result = new Dictionary<TKey, TValue>(collection.Count);
     else
        result = new Dictionary<TKey, TValue>();
     foreach (TValue item in items)
        result[selector(item)] = item;
     return result;
  }

Это позволяет выбрать свойство с лямбдой так: .Select(y => y.Article).Distinct(x => x.ArticleID);

0 голосов
/ 19 сентября 2008

Я не знаю существующего класса, но что-то вроде:

public class MyComparer<T> : IEqualityComparer<T>
{
  private Func<T, T, bool> _compare;
  MyComparer(Func<T, T, bool> compare)
  {
    _compare = compare;
  }

  public bool Equals(T x, Ty)
  {
    return _compare(x, y);
  }

  public int GetHashCode(T obj)
  {
    return obj.GetHashCode();
  }
}

Примечание. На самом деле я еще не скомпилировал и не запустил эту программу, поэтому возможна опечатка или другая ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...