Get a list of distinct items and their count
Solution 1
Here is how I understand the problem that you are trying to solve. You have a list of myobject
s. Each myobject
has a property called Names
which is a HashSet
of string
s (i.e., HashSet<string>
). You want to count the number of times each string
that appears in some myobject.Names
appears in all the myobject.Names
. That is, you have
"Alice", "Bob", "Charlie"
"Alice", "Bob", "Donald"
"Alice", "Donald", "Ernie"
as three myobject.Names
and you want to see
"Alice", 3
"Bob", 2
"Charlie", 1
"Donald", 2
"Ernie", 1
If so:
var query = list.SelectMany(x => x.Names)
.GroupBy(s => s)
.Select(g => new { Name = g.Key, Count = g.Count() });
foreach(var result in query) {
Console.WriteLine("Name: {0}, Count: {1}", result.Name, result.Count);
}
I do not see what role myobject.ID
plays here. Please qualify.
Solution 2
var query = yourList
.SelectMany(x => x.Names)
.GroupBy(x => x, (y, z) => new { Name = y, Count = z.Count() });
// and to test...
foreach (var item in query)
{
Console.WriteLine("{0} - {1}", item.Name, item.Count);
}
Clarence Klopfstein
I am a .NET programmer located in Cincinnati Ohio. I've been programming in .NET for four years. I ride in my car with my I AM A PC license plate with pride.
Updated on July 09, 2022Comments
-
Clarence Klopfstein almost 2 years
I have an object, that has many properties but the only two to worry about are:
myobject.ID
which is anint
myobject.Names
which is aHashSet
Then I have a
List
of those objects that looks something similar to this:List<myobject>
I use Linq to get a some of the data into a repeater, but I'm not sure how to get the list of Names and how often they show up.
Want to use Linq to avoid having to loop through the data.
As my tags should show, this is an ASP.NET solution using C#.
Some clarification:
Lets say I have just three items in my list: Item 1 has John, Fred, Jack in its names. Item 2 has John, Fred, Joe in its names. Item 3 has John in its names.I am trying to return the following: John - 3 Fred - 2 Jack - 1 Joe - 1
Also, as a note I am familiar with having to write my own comparer for my object, I'm just missing the 'how to' for the overall solution in my thoughts.
-
Clarence Klopfstein over 14 yearsmyobject.ID doesn't really play a role, I just wanted to make it clear that it wasn't a simple HashSet object.
-
jason over 14 yearsOkay. Then I believe that the above addresses your question. Let me know if anything needs clarification.
-
Clarence Klopfstein over 14 yearsYour example has GroupBy(s), but s doesn't exist.
-
jason over 14 yearsSorry, should be
GroupBy(s => s)
. -
Clarence Klopfstein over 14 yearsNever mind... typo in my code. Still working out your solution to see if it works.
-
TheLastGIS over 3 yearsThis has saved me a lot of work. Thank you very much @jason.