web-dev-qa-db-ja.com

C#NameValueCollectionを反復処理します

NameValueCollectionがあり、値を反復処理したい。現在、私はこれを行っていますが、それを行うにはきちんとした方法があるはずです:

NameValueCollection nvc = new NameValueCollection();
nvc.Add("Test", "Val1");
nvc.Add("Test2", "Val1");
nvc.Add("Test2", "Val1");
nvc.Add("Test2", "Val2");
nvc.Add("Test3", "Val1");
nvc.Add("Test4", "Val4");

foreach (string s in nvc)
    foreach (string v in nvc.GetValues(s))
        Console.WriteLine("{0} {1}", s, v);

Console.ReadLine();

ある?

70
Paul Michaels

Linqを使用してコレクションをフラット化できますが、それはforeachループのままですが、現在はより暗黙的です。

var items = nvc.AllKeys.SelectMany(nvc.GetValues, (k, v) => new {key = k, value = v});
foreach (var item in items)
    Console.WriteLine("{0} {1}", item.key, item.value);

最初の行は、ネストされたコレクションを、プロパティkeyおよびvalueを持つ匿名オブジェクトの(ネストされていない)コレクションに変換します。

key-> valueのコレクションの代わりに、マッピングkey-> valueになるようにフラット化されます。サンプルデータ:

前:

テスト-> [Val]、

Test2-> [Val1、Val1、Val2]、

Test3-> [Val1]、

Test4-> [Val4]

後:

テスト-> Val、

Test2-> Val1

Test2-> Val1

Test2-> Val2

Test3-> Val1

Test4-> Val4

92
Julian

2つのループを使用する代わりに、ルックアップにキーを使用できます。

foreach (string key in nvc)
{
    Console.WriteLine("{0} {1}", key, nvc[key]);
}
76
Fredrik Mörk

ここで新しいものはありません(@Julianによる+ 1'dの答えは機能的に同等です)。y'allはy'allに沿って移動してください。


[この場合はやり過ぎですが、関連する可能性のある]拡張メソッドのセットがあります 関連する質問への回答で

foreach ( KeyValuePair<string,string> item in nvc.AsEnumerable().AsKeyValuePairs() )
    Console.WriteLine("{0} {1}", item.key, item.value);
3
Ruben Bartelink

ネストされたループを回避するために私が見つけた唯一の方法は、追加のリストを使用して値を保存することです:

List<string> arrValues = new List<string>();
for (int i = 0; i < nvc.Count; i++)
    arrValues.AddRange(nvc.GetValues(i));
foreach (string value in arrValues)
    Console.WriteLine(value);

(.NET 2.0以降が必要です[のみ])

1
Shadow Wizard

私はこれが簡単だと思う:

For i As Integer = 0 To nvc.Count - 1
   Console.Write("No", "Key", "Value")
   Console.Write(i, nvc.GetKey(i), nvc.Get(i))
Next
0
var enu = myNameValueCollection.GetEnumerator();
while (enu.MoveNext())
{
    string key = (string)enu.Current;
    string value = myNameValueCollection[key];
}

またはキーがNULL可能の場合:

for (int i = 0; i < myNameValueCollection.Count; i++)
{
    string key = myNameValueCollection.GetKey(i);
    string value = myNameValueCollection.Get(i);
}
0