4

私がこれを持っているとしましょう:

class Foo
{
    public Guid id;
    public string description;
}

var list = new List<Foo>();
list.Add(new Foo() { id = Guid.Empty, description = "empty" });
list.Add(new Foo() { id = Guid.Empty, description = "empty" });
list.Add(new Foo() { id = Guid.NewGuid(), description = "notempty" });
list.Add(new Foo() { id = Guid.NewGuid(), description = "notempty2" });

今、私がこれを行うとき:

list = list.Distinct().Tolist();

明らかに4つの要素を返します。クラス内のすべてのデータを比較し、クラスのすべてのプロパティをチェックする一意の要素を返すメソッドが必要です。私は自分の比較子を書く必要がありますか、それともこのように動作する組み込みのものがありますか?

4

2 に答える 2

7

各フィールドを明示的に比較するには、オーバーライドFoo.Equals(およびその後) する必要があります。Foo.GetHashCodeそれ以外の場合は、デフォルトの実装Object.Equals( ReferenceEquals) が使用されます。

または、 メソッドに を明示的に渡すこともできIEqualityComparerますDistinct()


ただし、匿名クラスを使用すると3 つの要素が返されることに注意してください。使用する場所とFoo必要なコンパイル時の型の安全性に応じて、次のことができます。

var list = new List<dynamic>();
list.Add(new { id = Guid.Empty, description = "empty" });
list.Add(new { id = Guid.Empty, description = "empty" });
list.Add(new { id = Guid.NewGuid(), description = "notempty" });
list.Add(new { id = Guid.NewGuid(), description = "notempty2" });

list = list.Distinct().ToList(); //3 elements selected
于 2013-03-15T02:25:13.930 に答える
6

IEqualityComparerの別の実装が指定されるまで、 EqualityComparer.Defaultを使用して 2 つの項目をそれぞれ比較します。

于 2013-03-15T02:19:42.040 に答える