创建以下两个类 即可使用 Distinct Contains 扩展功能 实现某个字段的对比
public static class Equality<T>
{
public static IEqualityComparer<T> CreateComparer<V>(Func<T, V> keySelector)
{
return new CommonEqualityComparer<V>(keySelector);
}
public static IEqualityComparer<T> CreateComparer<V>(Func<T, V> keySelector, IEqualityComparer<V> comparer)
{
return new CommonEqualityComparer<V>(keySelector, comparer);
}
public class CommonEqualityComparer<V> : IEqualityComparer<T>
{
private Func<T, V> keySelector;
private IEqualityComparer<V> comparer;
public CommonEqualityComparer(Func<T, V> keySelector, IEqualityComparer<V> comparer)
{
this.keySelector = keySelector;
this.comparer = comparer;
}
public CommonEqualityComparer(Func<T, V> keySelector)
: this(keySelector, 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));
}
}
}
/// <summary>
/// 扩展类
/// </summary>
public static class Extensions
{
/// <summary>
/// 指定某个字段的重复
/// </summary>
/// <returns></returns>
public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector)
{
return source.Distinct(Equality<T>.CreateComparer(keySelector));
}
/// <summary>
/// 指定某个字段的重复
/// </summary>
/// <returns></returns>
public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector, IEqualityComparer<V> comparer)
{
return source.Distinct(Equality<T>.CreateComparer(keySelector, comparer));
}
/// <summary>
/// 指定某个字段的包含
/// </summary>
/// <returns></returns>
public static bool Contains<T, V>(this IEnumerable<T> source, T value, Func<T, V> keySelector)
{
return source.Contains(value, Equality<T>.CreateComparer(keySelector));
}
}