3

.NET 3.5 を使用して、複数の列でグループ化する必要がDataTableあり、列名は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]));

DataRowこれはとを取る関数IEnumerable<string>です。IEnumerable<string>(列名) を対応する列値 ( )に射影し、それらの値を文字cols.Select(col => row[col]))で結合します。|この文字を選択したのは、フィールドに含まれる可能性が低いためですが、別の区切り文字に交換することをお勧めします.

次に、単に

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

理想的には、任意の区切り文字で結び付けられた文字列ではなく、より適切な型を選択します。ただし、オブジェクトを選択すると、参照型の比較により問題が発生することが予想されます.2つのオブジェクトは、同じプロパティを持っていても等しくないためです。

于 2012-05-01T01:54:24.270 に答える