列表中的分组和计数

我有一个填充整数的列表,如下所示:

[0] 1 [1] 4 [2] 4 [3] 8 [4] 9 [5] 1 [6] 1 

所以基本上是随机数,但相同的数字可以在该列表中多次出现。

我想要的是按编号对它们进行分组,但我也可以告诉该数字在列表中的次数。 所以我有一个像:

 [0] [number] 1 [total] 3 // Occured 3 times in the list [1] [number] 4 [total] 2 [2] [number] 8 [total] 1 [3] [number] 9 [total] 1 

有没有快速/简单的方法来实现这一目标? 或者我是否已经写出各种循环和检查来手动构建这样的东西?

使用GroupByCount

 var numberGroups = numbers.GroupBy(i => i); foreach(var grp in numberGroups) { var number = grp.Key; var total = grp.Count(); } 

这是另一个使用匿名类型存储一些信息的例子。 它还会创建一个数组,因为它似乎是所需的结果:

 var numberGroups = numbers.GroupBy(i => i) .Select(grp => new{ number = grp.Key, total = grp.Count(), average = grp.Average(), minimum = grp.Min(), maximum = grp.Max() }) .ToArray(); foreach (var numInfo in numberGroups) { var number = numInfo.number; // ... var maximum = numInfo.maximum; } 

用这个

 var result = numbers.GroupBy(n => n) .Select(c => new { Key = c.Key, total = c.Count() }); 

这是各种循环和检查的示例:

 var items = new Dictionary(); foreach(var number in numbers) { if(items.ContainsKey(number)) items[number]++; else items.Add(number, 1); } 

仅供参考。 我更喜欢LINQ方法,但它并不像你可能认为的那么糟糕。

我的解决方案

 var result = from i in n group i by i into g select new {g.Key, Count= g.Count()}; 

使用上面的Tims方法使用Select而不是foreach,你可以做:

 var itemsByGroupWithCount = numbers.GroupBy(i => i) .Select(item => new { Number = item.Key, Total = item.Count()});