19

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

[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

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

4

6 回答 6

33

使用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;
}
于 2012-05-15T11:54:47.817 回答
11

用这个

var result = numbers.GroupBy(n => n)
                    .Select(c => new { Key = c.Key, total = c.Count() });
于 2012-05-15T12:00:45.887 回答
1

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

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

反正仅供参考。我更喜欢 LINQ 方法,但它并没有你想象的那么糟糕。

于 2012-05-15T12:04:40.497 回答
1

我的解决方案:

var result = from i in n 
group i by i into g
select new {g.Key, Count= g.Count()};
于 2012-05-15T12:43:09.480 回答
0

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

var itemsByGroupWithCount = numbers.GroupBy(i => i)
                 .Select(item => new { 
                        Number = item.Key, 
                        Total = item.Count()});
于 2012-05-15T12:01:09.017 回答
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

如果您想检查它是如何工作的,这是所用函数的文档

于 2019-09-30T13:33:01.773 回答