我有一个字典,其中键是一个字符串,值是与该键对应的字符串列表.我想显示字典中的所有键,其中与该键相关联的值标签在该键下方.像这样的东西:
Key 1
    Value 1
    Value 2
    Value 3
Key 2
    Value 1
    Value 2
在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);
    }
}
我如何使用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)
                  );
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);
所以你给Aggregate方法赋予两个值; 种子值和'组合器'功能:
0在本例中).x.这就是该Aggregate方法的工作原理List<int>.它的工作方式相同KeyValuePair<string, List<string>>,但只是使用不同的类型.
| 归档时间: | 
 | 
| 查看次数: | 14586 次 | 
| 最近记录: |