353

のクラスItemsがありproperties (Id, Name, Code, Price)ます。

のリストにItemsは、重複したアイテムが取り込まれています。

例:

1         Item1       IT00001        $100
2         Item2       IT00002        $200
3         Item3       IT00003        $150
1         Item1       IT00001        $100
3         Item3       IT00003        $150

linqを使用してリスト内の重複を削除するには?

4

11 に答える 11

687
var distinctItems = items.GroupBy(x => x.Id).Select(y => y.First());
于 2010-11-04T08:48:44.443 に答える
437
var distinctItems = items.Distinct();

一部のプロパティのみを照合するには、カスタム等値比較子を作成します。たとえば、次のようになります。

class DistinctItemComparer : IEqualityComparer<Item> {

    public bool Equals(Item x, Item y) {
        return x.Id == y.Id &&
            x.Name == y.Name &&
            x.Code == y.Code &&
            x.Price == y.Price;
    }

    public int GetHashCode(Item obj) {
        return obj.Id.GetHashCode() ^
            obj.Name.GetHashCode() ^
            obj.Code.GetHashCode() ^
            obj.Price.GetHashCode();
    }
}

次に、次のように使用します。

var distinctItems = items.Distinct(new DistinctItemComparer());
于 2009-10-22T11:51:18.060 に答える
44

Distinct クエリに問題がある場合は、MoreLinqを調べて DistinctBy 演算子を使用し、id で個別のオブジェクトを選択することをお勧めします。

var distinct = items.DistinctBy( i => i.Id );
于 2009-10-22T12:00:16.687 に答える
34

これが、Linq でグループ化できた方法です。それが役に立てば幸い。

var query = collection.GroupBy(x => x.title).Select(y => y.FirstOrDefault());
于 2011-03-10T15:59:02.547 に答える
17

使用Distinct()しますが、デフォルトの等値比較子を使用して値を比較することに注意してください。そのため、それ以上のものが必要な場合は、独自の比較子を実装する必要があります。

例については、http://msdn.microsoft.com/en-us/library/bb348436.aspxを参照してください。

于 2009-10-22T11:57:35.973 に答える