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();
ある?
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
2つのループを使用する代わりに、ルックアップにキーを使用できます。
foreach (string key in nvc)
{
Console.WriteLine("{0} {1}", key, nvc[key]);
}
ここで新しいものはありません(@Julianによる+ 1'dの答えは機能的に同等です)。y'allはy'allに沿って移動してください。
[この場合はやり過ぎですが、関連する可能性のある]拡張メソッドのセットがあります 関連する質問への回答で 。
foreach ( KeyValuePair<string,string> item in nvc.AsEnumerable().AsKeyValuePairs() )
Console.WriteLine("{0} {1}", item.key, item.value);
ネストされたループを回避するために私が見つけた唯一の方法は、追加のリストを使用して値を保存することです:
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以降が必要です[のみ])
私はこれが簡単だと思う:
For i As Integer = 0 To nvc.Count - 1
Console.Write("No", "Key", "Value")
Console.Write(i, nvc.GetKey(i), nvc.Get(i))
Next
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);
}