3

使用 .NET 3.5,我需要DataTable按多个列对 a 进行分组,其中列名包含在IEnumerable.

// column source
IEnumerable<string> columns;
DataTable table;

IEnumerable<IGrouping<object, DataRow>> groupings = table
    .AsEnumerable()
    .GroupBy(row => ???);

通常是这里???描述的匿名类型,但我需要用作列源。这可能吗?columns

4

1 回答 1

2

最简单的方法是创建一个函数,该函数选择所需的列并创建一个散列以进行比较。我会做这样的事情:

Func<DataRow, IEnumerable<string>, string> f = (row, cols) => 
    String.Join("|", cols.Select(col => row[col]));

这是一个采用 aDataRow和 an的函数IEnumerable<string>。它将IEnumerable<string>(列名)投影到相应的列值 ( cols.Select(col => row[col]))) 中,然后将这些值与一个|字符连接起来。我选择这个字符是因为它不太可能包含在您的字段中,但您可能希望换成另一个分隔符。

然后简单

IEnumerable<IGrouping<object, DataRow>> groupings = table
    .AsEnumerable()
    .GroupBy(row => f(row, columns));

理想情况下,我们会选择更好的类型——而不是用任意分隔符捆绑在一起的字符串。但是我希望选择一个对象会由于引用类型的比较而导致问题,因为即使它们具有相同的属性,两个对象也不相等。

于 2012-05-01T01:54:24.270 回答