1

次のデータを含む3つの列があるDataTable場合:

1 A qwqw
2 A wewe
3 B tyty
4 B trtr
5 C iuiu

Dictionary(Of String, List(Of Foo))上記のデータを次のように配置する最も簡単で効率的な方法は何ですか?

[A] -> {New Foo(1, A, qwqw), New Foo(2, A, wewe)}
[B] -> {New Foo(3, B, tyty), New Foo(4, B, trtr)}
[C] -> {New Foo(5, C, iuiu)}

ここFooで、はテーブルのフィールドを表すメンバーを持つタイプです。私が行ったことは、クエリ(LINQ)を記述して、最初にの2番目の列の一意の値を取得することList(Of String)です。次に、このリストを繰り返して、リスト内の各要素に対して別のクエリを実行し、Fooのオブジェクトが作成されたリスト内の対応する行を取得してリストに追加します。このリストはDictionary、要素としてキーを使用して値として追加されます。 。何か案は?

4

2 に答える 2

2

これがC#の答えです:

myDataTable.Rows.GroupBy(r => r[1]).ToDictionary(
    g => g.Key
,   g => g.Select(rr => new Foo(rr[0], rr[1], rr[2])).ToList()
);

アイデアは、最初に中央の列(#1)でグループ化し、次にグループを辞書に変換し、グループキーを辞書キーとして使用Fooし、グループの各行から作成することです。

于 2012-05-04T04:08:48.557 に答える
1

dasblinkenlightのおかげで、私は彼のC#構造をVB.NETに変換することができました。

Dim r as Dictionary(Of String, List(Of String)) = New Dictionary(Of String, List(Of String))
r = myDataTable.AsEnumerable.GroupBy(Function(x) x(1).ToString()).ToDictionary(Function(g) g.Key, Function(g) g.Select(Function(rr) New Foo(rr.Field(Of String)(0), rr.Field(Of String)(1), rr.Field(Of String)(2)).ToList())

そして、それは完璧に機能します。

于 2012-05-04T04:41:31.947 に答える