2017-03-28 2 views
-2

私はクラスItemsの属性がです。Linqは列の値ごとに重複レコードを削除します。C#

Itemsのリストには重複した項目が入ります。例えば

:LINQを使用して、リスト内の重複を削除する方法

1  Item1 IT00001 Insert 
2  Item1 IT00001 Delete 
3  Item3 IT00003 Insert 
4  Item4 IT00004 Update 

?私の出力は

3  Item3 IT00003 Insert 
4  Item4 IT00004 Update 
+1

をあなたがこれまで自分で試してみましたがどのような私たちを見ることができますか..?なぜアイテム/アクションの意味を見るコードを書くことができないのですか?挿入アクションはアクションの削除とは異なりますので、実際は重複しません – MethodMan

答えて

0

あなたはLINQでそれを行うことができます。

var filteredList = list.GroupBy(o => o.Name) 
         .Where(g => g.Count() == 1) 
         .SelectMany(g => g.Select(o => o)) 
         .ToList(); 
+0

ここでは、上記であなたは出現が1つだけである場所をとっています。しかし、私はそれらを削除する必要がある場合。 –

+0

'> 1'に変更するだけで、すべての複製を残してユニークなアイテムをフィルタリングします。 –

+0

申し訳ありませんが、フレーズqを正しく設定できませんか?両方のレコードのアクションが同じである場合、削除したくない場合はクエリが適切です –

0

以下のコードになるように、Nameプロパティについての明確な項目に新しいリストを返します。

public class Test 
    { 
     public int Id; 
     public string Name; 
    } 

    public class TestNameComparer : IEqualityComparer<Test> 
    { 
     public bool Equals(Test x, Test y) 
     { 
      if (x == null) return y == null; 
      return x == y || string.Equals(x.Name, y.Name); 
     } 

     public int GetHashCode(Test obj) 
     { 
      return obj.Name.GetHashCode(); 
     } 
    } 

とコール:だから

 //List<Test> list = ...; 
     var distinct = list.Distinct(new TestNameComparer()); 

、異なる値を計算するときに考慮するプロパティ(複数のプロパティさえ)に応じて、IEqualityComparerを適宜変更します。

+0

ありがとう、しかし、同じ名前だが複数のアクションを持つアイテムを削除します。だから、その場合、私の出力はitems1を全く持たないでしょう –

関連する問題