簡體   English   中英

C# 遍歷 NameValueCollection

[英]C# Iterate through 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();

在那兒?

您可以使用 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],

測試 2 -> [Val1, Val1, Val2],

測試 3 -> [Val1],

測試 4 -> [Val4]

后:

測試 -> Val,

測試 2 -> Val1,

測試 2 -> Val1,

測試 2 -> Val2,

測試 3 -> Val1,

測試 4 -> Val4

您可以使用鍵進行查找,而不是有兩個循環:

foreach (string key in nvc)
{
    Console.WriteLine("{0} {1}", key, nvc[key]);
}

這里沒有什么新東西(@Julian 的 +1 由我回答在功能上是等效的),請大家繼續前進。


在相關問題的答案中,我有一個 [overkill for this case but possible related ] 擴展方法集,它可以讓您執行以下操作:

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

我認為這更簡單: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));
}

我發現避免嵌套循環的唯一方法是使用額外的 List 來存儲值:

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

(需要 [only] .NET 2.0 或更高版本)

var enu = myNameValueCollection.GetEnumerator();
while (enu.MoveNext())
{
    string key = (string)enu.Current;
    string value = myNameValueCollection[key];
}

OR 當鍵可以為空時:

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

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

    );
}
foreach ( string key in nvc.Keys )
   Console.WriteLine("{0} {1}", key, nvc[key]);

這將返回您所有的鍵和相應的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM