分组并在列表中计数

问题描述 投票:17回答:6

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

[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

是否有快速/简便的方法来完成此任务?还是我可以写出各种循环并进行检查以手动构造类似的东西?

c#
6个回答
24
投票

使用GroupByGroupBy

Count

这是另一个使用匿名类型存储一些信息的示例。由于它似乎是期望的结果,因此它也会创建一个数组:

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

7
投票

使用此

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
投票

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

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

仅供参考。我更喜欢LINQ方法,但是它确实没有您认为的那么严重。


1
投票

我的解决方案:

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

0
投票

使用上面的Selects方法而不是foreach方法来使用Tims方法:

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

0
投票

仅使用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

© www.soinside.com 2019 - 2024. All rights reserved.