19

次のように、intで満たされたリストがあります。

[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 result = from i in n 
group i by i into g
select new {g.Key, Count= g.Count()};
于 2012-05-15T12:43:09.480 に答える
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 に答える
0

上記の Tims メソッドを foreach ではなく Select で使用すると、次のことができます。

var itemsByGroupWithCount = numbers.GroupBy(i => i)
                 .Select(item => new { 
                        Number = item.Key, 
                        Total = item.Count()});
于 2012-05-15T12:01:09.017 に答える