I have an object, that has many properties but the only two to worry about are:
myobject.ID
which is an int
myobject.Names
which is a HashSet
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.
You can use the combination of the SUM and COUNTIF functions to count unique values in Excel. The syntax for this combined formula is = SUM(IF(1/COUNTIF(data, data)=1,1,0)). Here the COUNTIF formula counts the number of times each value in the range appears.
Counting unique / distinct rows in Excel is akin to counting unique and distinct values, with the only difference that you use the COUNTIFS function instead of COUNTIF, which lets you specify several columns to check for unique values.
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.
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);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With