列舉NameValueCollection集合內所有的資料

NameValueCollection位於System.Collections.Specialized命名空間下,是一種非Hash型的集合物件,這類型的物件的特性就是Keys可以重複,這代表你必須要多一層的迴圈來運行,才可以真實的列舉出所有的集合值。(否則你可能只有取到第一筆資料而已,且事實上你也不可能單使用一層取回資料,因為第一層回傳的value是object。)

例如我們有這樣的合法NameValueCollection集合:

var oNC = new System.Collections.Specialized.NameValueCollection();
oNC.Add("A", "小明");
oNC.Add("A", "小華"); //鍵值重複
oNC.Add("B", "小英");

NameValueCollection內值得結果會長得像這樣:

A --> [小明、小華]
B --> [小英]

讓我們用LINQ把它拍扁(Flatten)吧!

多一層迴圈其實也不是甚麼樣的問題,但其實我們可以靠LINQ SelectMany來幫我們把集合拍扁,讓他的結構層次從二階層降回一階層,讓程式碼更精簡,以下是程式碼範例。

//拍扁它
var oCollections = oNC.AllKeys.SelectMany(
  oNC.GetValues,
  (k, v) => new {key = k, value = v}
);
//簡單的一階層迴圈就拿到資料嘍
foreach (var oItem in oCollections)
{ Console.WriteLine($"{oItem.key}: {oItem.value}"); }

輸出結果會長得像這樣:

A: 小明
A: 小華
B: 小英

單一鍵且多值合併

在HTTP的世界裡面應用的最多,就是單一鍵但有多重值,這時候我們可以這樣處理:

var oCollections =
      oNC.AllKeys
        .GroupBy(k => k)
        .Select(g => $"{g.Key}: {string.Join("、", g.SelectMany(value => oNC.GetValues(value)))}");
//簡單的一階層迴圈就拿到資料嘍
foreach (var oItem in oCollections)
{ Console.WriteLine($"{oItem.key}: {oItem.value}"); }

輸出結果會長得像這樣:

A: 小明、小華
B: 小英

相關連結

System.Collections.Specialized.NameValueCollection LINQ Flat Flatten ForNext Foreach