2013-03-01 51 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)'的类型参数不能根据用法推断出来。尝试明确指定类型参数