我是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];
}
}
}
答案 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集合 - 这样查询不需要调用索引器来获取相应的整数计数值。