Вопрос по c# – Группировать по и считать в списке

16

У меня есть список, который заполнен целыми числами, как это:

[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

Есть ли быстрый / простой способ сделать это? Или я должен написать все виды циклов и проверок, чтобы создать что-то подобное вручную?

Используйте LINQ. Подождите, ответы будут влить. Nikhil Agrawal

Ваш Ответ

5   ответов
1

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

all sorts of loops and checks:

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

Просто для справки в любом случае. Я предпочитаю подход LINQ, но на самом деле это не такая серьезная проблема, как вы, возможно, полагали.

7

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

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;
}
Спасибо, именно то, что мне нужно :) w00
У меня действительно есть одна маленькая проблема. Надеюсь, вы можете помочь мне с этим. Я пытаюсь разрешить функции возвращать только что созданный массив. Это работает нормально, но когда я пытаюсь получить доступ к свойствам, это выдает мне ошибку даже если они там.i.imgur.com/KIKgJ.png --- Есть идеи, как это решить? w00
@besworland: Во втором примере это массив анонимного типа, который вы можете использовать как обычный класс, но только в текущем методе.
Какой тип номераGroup получит в этом случае?
@besworland: если вы хотите использовать результат в другом месте, вы можете создать экземпляр пользовательского класса вSelect когда я создаю этот анонимный тип. Затем вы также можете вернуть результат из метода f.e. какYourType[] или какTuple<int,int>.
0

var itemsByGroupWithCount = numbers.GroupBy(i => i)
                 .Select(item => new { 
                        Number = item.Key, 
                        Total = item.Count()});

Похожие вопросы