使用.NET 3.5,我需要将DataTable
分组为多列,其中列名称包含在IEnumerable
中。
// column source
IEnumerable<string> columns;
DataTable table;
IEnumerable<IGrouping<object, DataRow>> groupings = table
.AsEnumerable()
.GroupBy(row => ???);
通常???
是匿名类型,如here所述,但我需要使用columns
作为列源。这可能吗?
答案 0 :(得分:2)
执行此操作的最简单方法是创建一个函数,该函数选择所需的列并创建用于比较的哈希。我会做这样的事情:
Func<DataRow, IEnumerable<string>, string> f = (row, cols) =>
String.Join("|", cols.Select(col => row[col]));
这是一个DataRow
和IEnumerable<string>
的函数。它将IEnumerable<string>
(列名称)投影到相应的列值(cols.Select(col => row[col]))
)中,然后将这些值与|
字符连接起来。我之所以选择这个角色是因为它不太可能包含在你的字段中,但是你可能想换掉另一个分隔符。
然后简单地
IEnumerable<IGrouping<object, DataRow>> groupings = table
.AsEnumerable()
.GroupBy(row => f(row, columns));
理想情况下,我们会选择更好的类型 - 而不是使用任意分隔符绑定的字符串。但是我希望选择一个对象会因为引用类型的比较而导致问题,因为两个对象即使它们具有相同的属性也不相等。