我有一个List<string>
,其中一些值正在重复。我希望获得特定string
及其出现的次数。我尝试了几种可行的方案,特别是它没有并且想要理解为什么?
代码:
var list = new List<string>() { "Yahoo" , "MSN", "Yahoo", "MSN", "Yahoo", "MSN", "MSN" };
//Works:
var lineWithNumberOfOccurance = linesFromTextFile.GroupBy(word => word).Select(g => new {Count = g.Count(), g.Key});
//Doesn't work:
var lineWithNumberOfOccurance = linesFromTextFile.GroupBy(x => x).ToDictionary(x => x.Count(), x => x.Key);
错误:
已添加具有相同键的项目。
然而,以下工作正常。
var list = new List<int>() {1, 2, 2, 3, 3, 3};
var test = list.GroupBy(x => x).ToDictionary(x => x.Count(), x => x.Key);
我不确定我在这里缺少什么。
答案 0 :(得分:3)
您混合了词典的Key
和Value
。您正尝试将Count
用作键。
因此,如果两个不同的单词出现的次数相同,则两个单词的键相同。只需将行更改为
即可var lineWithNumberOfOccurance = linesFromTextFile.GroupBy(x => x)
.ToDictionary(x => x.Key, x => x.Count());
您的上一个示例有效,因为1
发生一次,2
发生两次,3
发生三次,因此没有密钥冲突。你的第一个例子也应该用于工作,但我猜你刚才没有在你的问题中显示正确的测试值。
答案 1 :(得分:2)
字典中的键必须是唯一的。您使用 count 作为键,因此如果您有两个单词看起来相同的次数,那么您将获得异常。
您应该使用字作为密钥,因为您已经知道这是唯一的。
linesFromTextFile.GroupBy(x => x)
.ToDictionary(x => x.Key, x => x.Count());