1

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

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

我想要的是一个聚合字典,它为整个 Data 对象列表执行组合 WordFrequency。我知道如何使用循环来做到这一点(遍历列表,然后遍历每个字典),我的问题是,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];
            }
        }
   }
4

2 回答 2

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));

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

于 2013-02-12T21:21:18.150 回答
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 的解决方案一样,查询迭代 Dictionary 的 KeyValuePair,而不是迭代 Keys 集合——这样查询不需要调用索引器来获取相应的整数计数值。

于 2013-02-13T05:33:12.690 回答