如何在Linq中组合字典?

时间:2013-02-12 21:15:33

标签: linq

我是Linq的新手。我有这样的代码:

public class Data
{
    public Dictionary<string,int> WordFrequency; 
}
List<Data> dataList;

我想要的是一个聚合字典,它为整个Data对象列表组合WordFrequency。我知道如何使用循环(迭代List,然后遍历每个Dictionary),我的问题是,Linq语法是什么?谢谢。

编辑:这是我的(未经测试的)循环方法,所以你可以看到我的意思。

    public static Dictionary<string, int> Combine()
    {
        Dictionary<string, int> result;
        foreach (Data data in DataList)
        {
            foreach (string key in data.WordFrequencies.Keys)
            {
                if(!result.ContainsKey(key))
                    result[key] = 0;

                result[key] += data.WordFrequencies[key];
            }
        }
   }

2 个答案:

答案 0 :(得分:6)

所以你想把所有词典拼凑成一个没有重复键的词典 - 当然?

您可以使用Enumerable.SelectMany展平所有内容,使用Enumerable.GroupBy对内容进行分组。

Dictionary<string, int> allWordFrequency = dataList
            .SelectMany(d => d.WordFrequency)
            .GroupBy(d => d.Key)
            .ToDictionary(g => g.Key, g => g.Sum(d => d.Value));

我假设您想要对所有频率求和。

答案 1 :(得分:0)

这是一个基于查询的解决方案,与Tim的大多数问题相同:

Dictionary<string, int> allWordFrequency =
    (from d in dataList
    from kvp in d.WordFrequency
    group kvp.Value by d.Key)
       // ^^^^^^^^^ this grouping projection...
    .ToDictionary(g => g.Key, g => g.Sum());
  // ...eliminates need for lambda here ^^

我很欣赏这两个from子句如何在帖子的基于循环的方法中模仿嵌套的foreach循环。与Tim的解决方案一样,查询迭代字典的KeyValuePair而不是迭代Keys集合 - 这样查询不需要调用索引器来获取相应的整数计数值。