I have an List which is filled with ints, like this:
[0] 1
[1] 4
[2] 4
[3] 8
[4] 9
[5] 1
[6] 1
So basically random numbers in there, but the same number can occure multiple times in that list.
What i want is to group them by number, but that i can also tell how many times that number was in the list. So that i have a something like:
[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
Is there a fast/easy way to accomplish this? Or do i have the write out all sorts of loops and checks to construct something like this manually?
Use GroupBy
and Count
:
var numberGroups = numbers.GroupBy(i => i);
foreach(var grp in numberGroups)
{
var number = grp.Key;
var total = grp.Count();
}
Here's another example which uses an anonymous type to store some informations. It also creates an array since it seems to be the desired result:
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;
}
Use this
var result = numbers.GroupBy(n => n)
.Select(c => new { Key = c.Key, total = c.Count() });
Here's an example of 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);
}
Just for reference anyway. I prefer the LINQ approach, but it's not really as bad of a problem as you may have believed.
My solution:
var result = from i in n
group i by i into g
select new {g.Key, Count= g.Count()};
Using Tims method from above with a Select rather than a foreach you could do:
var itemsByGroupWithCount = numbers.GroupBy(i => i)
.Select(item => new {
Number = item.Key,
Total = item.Count()});
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.