33

私はこれを持っています

 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を使用してみましたが、匿名タイプを使用しているため、関連付けられるタイプはありません。

「オビ=ワン・ケノービを助けてください、あなたは私の唯一の希望です」

4

3 に答える 3

19

秘訣は、推測された型でのみ機能する比較器を作成することです。例えば:

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);
于 2009-07-01T22:17:19.790 に答える
3

ほとんどの場合、(等式または並べ替えのために)比較するときは、等式または比較方法自体ではなく、比較するキーを選択することに関心があります(これは、Pythonのリスト並べ替えAPIの背後にある考え方です)。

ここにキーの同等性比較器の例があります。

于 2009-08-06T14:56:44.137 に答える
1

IEqualityComparer<T>DistinctやExceptのようなsetメソッドはnotを必要とするため、JaredParの答えは質問に完全には答えないことに注意してください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の回答と同じ、静的クラスのトリックからの推論が使用されている場合。

より一般的には、2つFuncのsを提供できます。aはFunc<T, T, bool>同等性をチェックFunc<T, T, int>し、ハッシュコードを選択します。

于 2011-05-31T16:19:24.920 に答える