public class EqualityComparer<T, V> : IEqualityComparer<T>
{
private readonly Func<T, V> _selector;
public EqualityComparer(Func<T, V> selector)
{
_selector = selector;
}
public bool Equals([AllowNull] T x, [AllowNull] T y)
{
return EqualityComparer<V>.Default.Equals(_selector(x), _selector(y));
}
public int GetHashCode([DisallowNull] T obj)
{
return EqualityComparer<V>.Default.GetHashCode(_selector(obj));
}
}
public static class LinqExtentions
{
public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> selector)
{
return source.Distinct(new EqualityComparer<T, V>(selector));
}
}
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
...
IEnumerable<Item> items = new List<Item>();
items = items.Distinct(x => x.Id);