使用LINQ查找重复的行(包含指定列的列表)

时间:2013-03-01 15:26:12

标签: c# linq

我使用下面的代码获取3列的重复行:String,Date,Money。 我想知道是否有任何通用方法可以在此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();
}

2 个答案:

答案 0 :(得分: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>(和一个相关的字典比较器)。

答案 1 :(得分:0)

执行上面的代码。

无法从用法推断出方法'System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable,System.Func)'的类型参数。尝试明确指定类型参数