我有一个填充了整数的列表,如下所示:
[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
有没有快速/简单的方法来实现这一目标?或者我是否已经写出各种循环和检查来手动构建这样的东西?
答案 0 :(得分:24)
使用GroupBy
和Count
:
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;
}
答案 1 :(得分:7)
使用此
var result = numbers.GroupBy(n => n)
.Select(c => new { Key = c.Key, total = c.Count() });
答案 2 :(得分:1)
以下是各种循环和检查的示例:
var items = new Dictionary<int,int>();
foreach(var number in numbers)
{
if(items.ContainsKey(number))
items[number]++;
else
items.Add(number, 1);
}
无论如何只是为了参考。我更喜欢LINQ方法,但它并不像你可能认为的那么糟糕。
答案 3 :(得分:1)
我的解决方案:
var result = from i in n
group i by i into g
select new {g.Key, Count= g.Count()};
答案 4 :(得分:0)
使用上面的Tims方法使用Select而不是foreach:
var itemsByGroupWithCount = numbers.GroupBy(i => i)
.Select(item => new {
Number = item.Key,
Total = item.Count()});
答案 5 :(得分:0)
仅使用GroupBy
方法就可以做到这一点:
var itemsResult = numbers.GroupBy(i => i,
i => i,
(keys, numbersGrouped) =>
new{
number = numbersGrouped.FirstOrDefault(),
total = numbersGrouped.Count()
}
);
与其他实现相比,该方法的执行效果优于其他执行建议的GroupBy + Select
方法。
您可以在下面查看性能比较:
https://dotnetfiddle.net/0M2aKD
这是要检查其工作原理的函数的docs