2013-03-01 52 views
4

我使用下面的代碼來獲取3列的重複行:String,Date,Money。 我不知道是否有任何一般方法可以在此LINQ中輸入列名的動態列表以查找重複的行?使用LINQ查找重複的行(帶有指定列的列表)

DataTable allDuplicates = dt.AsEnumerable() 
    .GroupBy(dr => new 
    { 
     Field1 = dr.Field<object>("String"), 
     Field2 = dr.Field<object>("Date"), 
     Field3 = dr.Field<object>("Money"), 
    }) 
    .Where(g => g.Count() > 1) 
    .SelectMany(g => g) 
    .ToList().CopyToDataTable(); 
} 

回答

3

如何使用自定義ArrayEqualityComparer<T>類型(如一個listed here):

string[] colsToConsider = ... 

var allDuplicates = dt.AsEnumerable() 
         .GroupBy(dr => colsToConsider.Select(dr.Field<object>) 
                .ToArray(), 
           new ArrayEqualityComparer<object>())  
         .Where(g => g.Count() > 1) 
         .SelectMany(g => g) 
         .CopyToDataTable(); 

您也可以考慮使用Dictionary<TKey, TValue>(以及相關的字典的比較器),如果你發現了隱式使用數組指數在這裏是駭人聽聞的。

+0

令人難以置信!它像一個魅力。你必須是主人。但是,我花了一段時間才意識到ArrayEqualityComparer不是內置的.NET庫,它是由您提供的鏈接自定義創建的。 – 2013-03-01 16:04:46

+0

乾杯。我在回答中加入了「自定義」一詞,以使其更清晰。 – Ani 2013-03-01 16:09:19

+0

太棒了!正是我所期待的。 – 2017-02-13 05:00:05

0

同時執行上面的代碼。

方法'System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable,System.Func)'的類型參數不能根據用法推斷出來。嘗試明確指定類型參數