2012-05-04 9 views
1

私は、次のデータでDataTableで3列を持っている場合:私はこれを簡単な方法でどうやって行うのですか?

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は、テーブル内のフィールドを表すメンバーを持つ型です。 私が行ったことは、最初にList(Of String)の2番目の列に一意の値を取得するクエリ(LINQ)が書かれています。次に、このリストを繰り返し、リスト内の各要素の別の問合せを実行し、リスト内の対応する行を取得し、Fooのどのオブジェクトを作成してリストに入れるかを指定します。次に、キーとして値がDictionaryに追加されます。素子。何か案は?ここ

+0

vb.netに翻訳できるのであれば、C#の回答を得ることができます。 – dasblinkenlight

+0

確かに、進んでください。私が成功すれば、私は結果を返信します。 – badmaash

答えて

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を作成しますグループ内の各行からdasblinkenlightへ

1

おかげで、私はVB.NETに彼のC#の構文を変換するために管理:

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()) 

そして、それは完璧に動作します。

+0

私はあなたがdasblinkenlightによって与えられた答えに努力を払い、あなたのアプリケーション言語で回答を提供するのが好きです。あなたのためにupvoteとdasblinkenlight、爽やかな何か。 – Jasonw

関連する問題