Linq Distinct 扩展

public class CommonEqualityComparer<T, V> : IEqualityComparer<T>
{
private Func<T, V> keySelector;
private IEqualityComparer<V> comparer;
public CommonEqualityComparer(Func<T, V> keySelector, IEqualityComparer<V> comparer = null)
{
this.keySelector = keySelector;
this.comparer = comparer ?? EqualityComparer<V>.Default;
}

public bool Equals(T x, T y)
{
return comparer.Equals(keySelector(x), keySelector(y));
}

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

public static class DistinctExtensions
{
public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector, IEqualityComparer<V> comparer = null)
{
return source.Distinct(new CommonEqualityComparer<T, V>(keySelector, comparer));
}
}

posted on 2013-03-15 17:15  君凌  阅读(213)  评论(0)    收藏  举报

导航