簡體   English   中英

按列表分組並計入

[英]Group by and count in List

我有一個填充了整數的List,如下所示:

[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<int,int>();
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()});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM