Группировать по и считать в списке
У меня есть List, который заполнен ints, вот так:
[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
Есть ли быстрый/простой способ достичь этого? Или я могу написать все виды циклов и проверок, чтобы построить что-то вроде этого вручную?
Ответы
Ответ 1
Используйте 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;
}
Ответ 2
Использовать это
var result = numbers.GroupBy(n => n)
.Select(c => new { Key = c.Key, total = c.Count() });
Ответ 3
Вот пример всех видов циклов и проверок:
var items = new Dictionary<int,int>();
foreach(var number in numbers)
{
if(items.ContainsKey(number))
items[number]++;
else
items.Add(number, 1);
}
Так или иначе. Я предпочитаю подход LINQ, но это не так плохо, как вы могли поверить.
Ответ 4
Мое решение:
var result = from i in n
group i by i into g
select new {g.Key, Count= g.Count()};
Ответ 5
Используя метод Tims сверху с помощью Select, а не foreach, который вы можете сделать:
var itemsByGroupWithCount = numbers.GroupBy(i => i)
.Select(item => new {
Number = item.Key,
Total = item.Count()});
Ответ 6
Используя только метод GroupBy
, вы можете сделать это следующим образом:
var itemsResult = numbers.GroupBy(i => i,
i => i,
(keys, numbersGrouped) =>
new{
number = numbersGrouped.FirstOrDefault(),
total = numbersGrouped.Count()
}
);
По сравнению с другими реализациями он превосходит метод GroupBy + Select
, предложенный другими, выполняющими менее чем половину времени.
Вы можете проверить ниже сравнение производительности:
https://dotnetfiddle.net/0M2aKD
Это документы для функции, используемой, если вы хотите проверить, как она работает