为的IEqualityComparer匿名类型
-
21-08-2019 - |
题
我有此
var n = ItemList.Select(s => new { s.Vchr, s.Id, s.Ctr, s.Vendor, s.Description, s.Invoice }).ToList();
n.AddRange(OtherList.Select(s => new { s.Vchr, s.Id, s.Ctr, s.Vendor, s.Description, s.Invoice }).ToList(););
我想如果它这样做允许在那里
n = n.Distinct((x, y) => x.Vchr == y.Vchr)).ToList();
我试图使用通用 LambdaComparer 但由于使用im匿名类型没有类型它与相关联。
“帮我欧比旺·克诺比,你是我唯一的希望”
解决方案
诀窍是创建一个比较器,仅适用于推断类型。例如:
public class Comparer<T> : IComparer<T> {
private Func<T,T,int> _func;
public Comparer(Func<T,T,int> func) {
_func = func;
}
public int Compare(T x, T y ) {
return _func(x,y);
}
}
public static class Comparer {
public static Comparer<T> Create<T>(Func<T,T,int> func){
return new Comparer<T>(func);
}
public static Comparer<T> CreateComparerForElements<T>(this IEnumerable<T> enumerable, Func<T,T,int> func) {
return new Comparer<T>(func);
}
}
现在我可以做以下...哈克溶液:
var comp = n.CreateComparerForElements((x, y) => x.Vchr == y.Vchr);
其他提示
很多时候你比较(相等或排序)你有兴趣在选择键被进行比较的时候,而不是平等的或比较法本身(这是背后Python的列表排序API的想法)。
有这里是一个例子关键相等比较。
我注意到JaredPar的答案并不完全回答,因为一套方法,如鲜明的问题,除了需要IEqualityComparer<T>
不是IComparer<T>
。下面假设一个IEquatable将具有合适的GetHashCode,它当然具有合适的Equals方法。
public class GeneralComparer<T, TEquatable> : IEqualityComparer<T>
{
private readonly Func<T, IEquatable<TEquatable>> equatableSelector;
public GeneralComparer(Func<T, IEquatable<TEquatable>> equatableSelector)
{
this.equatableSelector = equatableSelector;
}
public bool Equals(T x, T y)
{
return equatableSelector.Invoke(x).Equals(equatableSelector.Invoke(y));
}
public int GetHashCode(T x)
{
return equatableSelector(x).GetHashCode();
}
}
public static class GeneralComparer
{
public static GeneralComparer<T, TEquatable> Create<T, TEquatable>(Func<T, TEquatable> equatableSelector)
{
return new GeneralComparer<T, TEquatable>(equatableSelector);
}
}
其中从一个静态类特技相同推理用作JaredPar的答案。
要更一般你可以提供两个Func
s:一个Func<T, T, bool>
检查平等和Func<T, T, int>
选择哈希码
不隶属于 StackOverflow