2011-01-20 5 views

答えて

2

を整理するためにインフレクタを起動し、手動で必要な列を追加することができますセクションを必要としています。

var dt = new DataTable(); 
dt.Columns.Add("Id", typeof(int)); 
dt.Columns.Add("Name", typeof(string)); 
dt.Rows.Add(1, "Hello"); 
dt.Rows.Add(2, "World"); 
dt.Rows.Add(1, "Foo"); // dupe key 

var nvc = new NameValueCollection(); 
foreach (DataRow row in dt.Rows) 
{ 
    string key = row[0].ToString(); 
    // tidy up key here 
    nvc.Add(key, row[1].ToString()); 
} 

// display nvc 
foreach (var key in nvc.AllKeys) 
    Console.WriteLine("{0}: {1}", key, nvc[key]); 

あなたがToDictionaryを使用することができDictionaryに興味があれば、重複キーが許可されている場合は、しかし、これは動作しません。その場合、別の優雅な解決策はToLookupを使用することです。

// optionally use a Func to do the tidying up 
// or call an existing method or do it inline for simple operations 
Func<string, string> tidyFunc = (s) => s.Trim(); 
var lookup = dt.Rows.Cast<DataRow>() 
       .ToLookup(r => tidyFunc(r[0].ToString()), r => r[1].ToString()); 

foreach (var g in lookup) 
{ 
    Console.WriteLine("Key: " + g.Key); 
    foreach (var item in g) 
     Console.WriteLine(item); 
} 
+0

こんにちは、ありがとうございました。これが何をしているのか私に教えてくれますか?私はLINQ ToLookupに精通していません(r => tidyFunc(r [0] .ToString())、r => r [1] .ToString()) –

+0

@geocineまず、キャスト結果にLINQ拡張メソッドを使用するには 'IEnumerable 'を取得してください。次に、 'ToLookup'はすべての' DataRow'アイテムを反復し、キーセレクタはラムダ式を使って指定されます。ラムダ式は現在の行を反復で取り出し、それを使ってキーを指定します( 'r => r [0])。 ..部分)。同様に、要素セレクタを使用して余分なデータを指定します( 'r => r [1] ...'の部分)。ルックアップは、キー値とキーに属する要素で構成され、* 1から多くの*ルックアップ構造を提供します。希望が助けてくれる! –

+0

文字列key =行[0] .ToString(); はキーを取得するのではなく、行[0]の値を取得します。どのようにキー名を取得すると思いますか? –

関連する問題