我有一个用整数填充的列表,如下所示:
[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
是否有快速/简便的方法来完成此任务?还是我可以写出各种循环并进行检查以手动构造类似的东西?
使用GroupBy
和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;
}
这里是各种循环和检查的示例:
var result = numbers.GroupBy(n => n)
.Select(c => new { Key = c.Key, total = c.Count() });
仅供参考。我更喜欢LINQ方法,但是它确实没有您认为的那么严重。
我的解决方案:
var items = new Dictionary<int,int>();
foreach(var number in numbers)
{
if(items.ContainsKey(number))
items[number]++;
else
items.Add(number, 1);
}
使用上面的Selects方法而不是foreach方法来使用Tims方法:
var result = from i in n
group i by i into g
select new {g.Key, Count= g.Count()};
仅使用var itemsByGroupWithCount = numbers.GroupBy(i => i)
.Select(item => new {
Number = item.Key,
Total = item.Count()});
方法,您可以这样操作:
GroupBy
与其他实现相比,它比其他执行不到一半时间的提议的var itemsResult = numbers.GroupBy(i => i,
i => i,
(keys, numbersGrouped) =>
new{
number = numbersGrouped.FirstOrDefault(),
total = numbersGrouped.Count()
}
);
方法要好。
您可以在下面的性能比较中进行检查:
GroupBy + Select
如果要检查其功能,这是所用功能的https://dotnetfiddle.net/0M2aKD