77

があり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();

ある?

4

8 に答える 8

107

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

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

キー->値のコレクションではなく、マッピングキー->値になるようにフラット化されます。サンプルデータ:

前:

テスト->[Val]、

Test2-> [Val1、Val1、Val2]、

Test3-> [Val1]、

Test4-> [Val4]

後:

テスト->ヴァル、

Test2-> Val1

Test2-> Val1

Test2-> Val2、

Test3-> Val1、

Test4-> Val4

于 2011-02-21T13:29:01.593 に答える
87

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

foreach (string key in nvc)
{
    Console.WriteLine("{0} {1}", key, nvc[key]);
}
于 2011-02-21T12:34:54.307 に答える
4

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


関連する質問への回答に、[この場合はやり過ぎですが、おそらく関連する]拡張メソッドのセットがあります。これにより、次のことが可能になります。

foreach ( KeyValuePair<string,string> item in nvc.AsEnumerable().AsKeyValuePairs() )
    Console.WriteLine("{0} {1}", item.key, item.value);
于 2012-10-03T13:13:14.223 に答える
2
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);
}
于 2019-06-03T16:15:52.120 に答える
1

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

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以降が必要です)

于 2011-02-21T12:44:43.793 に答える
1

これはもっと簡単だと思います:VB.NET

For i As Integer = 0 To nvc.Count - 1
   Console.Write("No", "Key", "Value")
   Console.Write(i, nvc.GetKey(i), nvc.Get(i))
Next

C#:

for (int i = 0; i <= nvc.Count - 1; i++)
{
    Console.Write("No", "Key", "Value");
    Console.Write(i, nvc.GetKey(i), nvc.Get(i));
}
于 2017-12-17T11:27:05.663 に答える
0
for (int i = 0; i < nvc.Count; i++) {
    System.Console.WriteLine(

        nvc.AllKeys[i] + " = " + nvc[i]

    );
}
于 2021-01-16T21:11:45.927 に答える
-2
foreach ( string key in nvc.Keys )
   Console.WriteLine("{0} {1}", key, nvc[key]);

これにより、すべてのキーと対応する値が返されます。

于 2011-02-21T12:34:54.453 に答える