匿名型のためにされた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 に使用してみましたが、イムので、何のタイプが存在しない匿名型を使用して関連付けます。
「オビ=ワン・ケノービ、私を助けて、あなたが私の唯一の希望です」
解決
トリックのみ推論さのタイプで動作比較子を作成することです。たとえばます:
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の背後にある考え方である)ではない。
ここの例キーの等価比較子のがあります。
私はIEqualityComparer<T>
ないIComparer<T>
を必要除きJaredParの答えは全く異なるように設定されたメソッドからの質問に答えていないことに注意してください。以下は、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
をチェックするFunc<T, T, bool>
より一般的には次の2つのFunc<T, T, int>
sを提供することができます。
所属していません StackOverflow