为的IEqualityComparer匿名类型(IEqualityComparer for anon

2019-06-24 16:46发布

我有这个

 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但由于使用匿名类型的即时通讯没有与类型相关联的。

“帮我欧比旺·克诺比,你是我唯一的希望”

Answer 1:

关键是要建立一个比较器,仅适用于推断类型。 例如:

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);


Answer 2:

很多时候你比较(相等或排序)你有兴趣在选择键被进行比较的时候,而不是平等的或比较方法本身(这是背后Python的列表排序API的想法)。

这里有一个例子关键相等比较这里 。



Answer 3:

我注意到,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>选择哈希码。



文章来源: IEqualityComparer for anonymous type