Используйте 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();
}

Ответ 1

Как насчет пользовательского типа ArrayEqualityComparer<T> (например, здесь):

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> (и связанного словаря-сравнения), если вы обнаружите, что неявное использование индексов массивов здесь хакировано.

Ответ 2

при выполнении выше кода.

Аргументы типа для метода 'System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable, System.Func)' не могут быть выведены из использования. Попробуйте явно указать аргументы типа