LINQ

2012-04-19 6 views
-2

を使用して、フィールドの値に基づいて重複を削除し、以下をご覧ください:私はすべての重複行(同じ「RMID」を有する)「Cpty」=「内部」を削除したいLINQ

 DataTable newTable = new DataTable(); 
     DataColumn colRMID = new DataColumn(); 
     colRMID.DataType = typeof(System.Int32); 
     colRMID.ColumnName = "RMID"; 

     DataColumn colCpty = new DataColumn(); 
     colCpty.DataType = typeof(System.String); 
     colCpty.ColumnName = "Cpty"; 

     newTable.Columns.Add(colRMID); 
     newTable.Columns.Add(colCpty); 

     DataRow r1 = newTable.NewRow(); 
     r1["RMID"] = 1234; 
     r1["Cpty"] = "Internal"; 
     newTable.Rows.Add(r1); 

     DataRow r2 = newTable.NewRow(); 
     r2["RMID"] = 5678; 
     r2["Cpty"] = "Wales Fargo"; 
     newTable.Rows.Add(r2); 


     DataRow r3 = newTable.NewRow(); 
     r3["RMID"] = 1234; 
     r3["Cpty"] = "External"; 
     newTable.Rows.Add(r3); 
     DataRow r4 = newTable.NewRow(); 
     r4["RMID"] = 9876; 
     r4["Cpty"] = "Internal"; 
     newTable.Rows.Add(r4); 

を。 だから、DataTableの私の最終的な出力があるべきこと:私はLINQ

を使用する必要が

RMID Cpty 
5678 "Wales fargo" 
1234 "External" 
9876 "Internal" 

おかげで、 Abhinav

+0

なぜLINQを使用する必要がありますか? –

+0

Distinctを見てください。 – Thomas

答えて

2

は、これは完全に効率的ではありませんが、それは冗長であると概念を示しています。また、結果が得られます。私はあなたのニーズに合わせてそれをきれいにすることができると確信しています。

 var excludes = newTable 
      .AsEnumerable() 
      .GroupBy(row => row.Field<int>("RMID")) 
      .Select(groupedRows => new { Rows = groupedRows, Count = groupedRows.Count() }) 
      .Where(groupedRows => groupedRows.Count > 1) 
      .Select(groupedRows => groupedRows.Rows.Single(row => row.Field<string>("Cpty") == "Internal")) 
      .Select(row => new { Rmid = row.Field<int>("RMID"), Cpty = row.Field<string>("Cpty") }); 

     var filteredSet = newTable 
      .AsEnumerable() 
      .Select(row => new { Rmid = row.Field<int>("RMID"), Cpty = row.Field<string>("Cpty") }) 
      .Except(excludes); 
+0

ありがとうございます。出来た。しかし、すべてのものをdatatableの形で取得するには、私はいくつかの余分なコードを書く必要がありました。 – Abhinav

+0

これで、「シーケンスに要素がありません」という例外が表示されます。シーケンスには複数の要素があります。 – Abhinav