列舉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: 小英