使用LINQ对字典中的出现进行分组和计数

时间:2015-11-19 12:42:33

标签: c# linq dictionary

假设我有Dictionary<int, String>以下数据集:

1 a
2 a
3 a
4 b
5 b
6 b
7 b
8 c
9 c
10 c

我有150个包含此词典的对象。每个对象都有不同的这些数据集。在键值对中,键总是1-10,值可能是此集{a,b,c}中的一个。 我想使用LINQ对这些数据进行分组,并按以下方式计算值(a,b,c)的出现次数。循环(for):

1st iteration : group 1 (a)
2nd iteration : group 1 (a) (a)
3rd iteration : group 1 (a) (a) (a)
4th iteration : group 1 (a) (a) (a) 
                group 2 (b)
5th iteration : group 1 (a) (a) (a) 
                group 2 (b) (b)
6th iteration : group 1 (a) (a) (a) 
                group 2 (b) (b) (b)
7th iteration : group 1 (a) (a) (a) 
                group 2 (b) (b) (b) (b)
8th iteration : group 1 (a) (a) (a) 
                group 2 (b) (b) (b) (b)
                group 3 (c)
9th iteration : group 1 (a) (a) (a) 
                group 2 (b) (b) (b) (b) 
                group 3 (c) (c)
10th iteration : group 1 (a) (a) (a) 
                 group 2 (b) (b) (b) (b) 
                 group 3 (c) (c) (c)

因此,根据值的出现创建组。 在第4次交互中,我创建了2个组(计数= 3,b计数= 1)。在第8次迭代中,我创建了3个组(计数= 3,b计数= 4,c计数= 1)。

此外,我想比较这些事件,看看哪个统计占主导地位。我怎样才能做到这一点?

由于

修改

感谢您的快速回答,但它并不适用于我。我没有足够精确,我还没有正确解释它。

for循环中的迭代描述了KNN算法中的特定K数字。所以我试图为K = 1,K = 2 ... K = 10实现KNN算法。我的想法是分析特定K的值组(标签a,b,c)对于给定的K,我需要知道我在每个组中有多少项来正确分类包含Dictionary<int, String>的对象,但仅限于特定数量的元素(K) - 并非所有他们一下子。对于K = 1,我只考虑了词典中的第一个KeyValuePair。对于K = 7我在词典中仅考虑了7个KeyValuePair,依此类推。基于此,我想比较特定Count的每个K值,这有助于我将每个对象分类为特定标签(a,b或c)。我想我需要使用for循环来实现这一目标。但我不知道怎么做。

如此简单的var result = myDict.GroupBy(x => x.Value).ToDictionary(x => x.Key, x => x.Count());将根据值(标签a,b,c)给出一组,但一次只能给出所有这些组。

我希望我能完全复杂化......

1 个答案:

答案 0 :(得分:7)

使用LINQ就可以了:

var result = myDict.GroupBy(x => x.Value).ToDictionary(x => x.Key, x => x.Count());

您不需要任何迭代,因为LINQ正在为您完成所有工作。

要获得最高金额,您现在可以简单地致电:

result.Max(x => x.Value);

或者,如果您还需要具有该金额的条目:

result.OrderBy(x => x.Value).First();