我有一个字典,其中键是一个字符串,值是与该键对应的字符串列表.我想显示字典中的所有键,其中与该键相关联的值标签在该键下方.像这样的东西:
Key 1
Value 1
Value 2
Value 3
Key 2
Value 1
Value 2
Run Code Online (Sandbox Code Playgroud)
在C#2.0中,我会这样做(values是Dictionary):
StringBuilder sb = new StringBuilder();
foreach(KeyValuePair<string, List<string>> pair in values)
{
sb.AppendLine(pair.Key);
foreach(string item in pair.Value)
{
sb.AppendLine('\t' + item);
}
}
Run Code Online (Sandbox Code Playgroud)
我如何使用LINQ进行等效操作?似乎它应该是可能的,但我无法弄清楚如何做到这一点.
如果我使用values.SelectMany(p => p.Values),那么只有值将在最终结果中,而不是键.
我想到的任何其他解决方案都有类似的限制.
Tom*_*rst 20
以下是使用聚合扩展方法的解决方案:
string result = values.Aggregate("",
(keyString, pair) =>
keyString + "\n" + pair.Key + ":"
+ pair.Value.Aggregate("",
(str, val) => str + "\n\t" + val)
);
Run Code Online (Sandbox Code Playgroud)
C#中的聚合子句没有LINQ语法(但显然在Visual Basic中有一些预定义的函数).
这个解决方案可能看起来有点复杂,但聚合方法非常有用.
它的工作原理如下:如果你有一个,List<int>你可以将所有值组合成一个聚合值.
这与该Select方法形成对比,该方法不会修改列表的长度.或者Where方法,它会缩小列表,但它仍然是一个列表(而不是单个值).
例如,如果您有一个列表,则{1, 2, 3, 4}可以将它们组合成单个值,如下所示:
int[] xs = {1, 2, 3, 4};
int sum = xs.Aggregate(0, (sumSoFar, x) => sumSoFar + x);
Run Code Online (Sandbox Code Playgroud)
所以你给Aggregate方法赋予两个值; 种子值和'组合器'功能:
0在本例中).x.这就是该Aggregate方法的工作原理List<int>.它的工作方式相同KeyValuePair<string, List<string>>,但只是使用不同的类型.
| 归档时间: |
|
| 查看次数: |
14586 次 |
| 最近记录: |