var p2 = products.Distinct(p => p.Name);
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Linq;
public class CommonEqualityComparer<T, V> : IEqualityComparer<T>
{
private Func<T, V> keySelector;
public CommonEqualityComparer(Func<T, V> keySelector)
{
this.keySelector = keySelector;
}
public bool Equals(T x, T y)
{
return EqualityComparer<V>.Default.Equals(keySelector(x), keySelector(y));
}
public int GetHashCode(T obj)
{
return EqualityComparer<V>.Default.GetHashCode(keySelector(obj));
}
}
{
public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector)
{
return source.Distinct(new CommonEqualityComparer<T, V>(keySelector));
}
}
Distinct 使用示例
new Person{ ID = 1, Name = "鹤冲天"},
new Person{ ID = 1, Name = "ldp"}
};
var ps1 = data1
.Distinct(p => p.ID)
.ToArray();
new Person{ ID = 1, Name = "鹤冲天"},
new Person{ ID = 2, Name = "鹤冲天"}
};
var ps2 = data2
.Distinct(p => p.Name)
.ToArray();
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Linq;
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)
{
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));
}
}
{
public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector)
{
return source.Distinct(new CommonEqualityComparer<T, V>(keySelector));
}
public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector, IEqualityComparer<V> comparer)
{
return source.Distinct(new CommonEqualityComparer<T, V>(keySelector, comparer));
}
}
IEqualityComparer<V> comparer = EqualityComparer<V>.Default)
{
return source.Distinct(new CommonEqualityComparer<T, V>(keySelector, comparer));
}
使用示例:
new Person{ ID = 1, Name = "LDP"},
new Person{ ID = 2, Name = "ldp"}
};
var ps3 = data3
.Distinct(p => p.Name, StringComparer.CurrentCultureIgnoreCase)
.ToArray();
EqualityComparer<T> 类 简要说明