从C#

时间:2016-08-31 16:08:55

标签: c# linq

我有一个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);

我不确定我在这里缺少什么。

2 个答案:

答案 0 :(得分:3)

您混合了词典的KeyValue。您正尝试将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());