2010-01-06 17 views
11

Mam obiekt, który ma wiele właściwości, ale tylko dwa zmartwienia są:Pobierz listę różnych przedmiotów i ich liczbę

myobject.ID który jest int
myobject.Names który jest HashSet

wtedy mam List z tych obiektów, które wygląda na coś podobnego do tego:

List<myobject> 

ja używać LINQ, aby uzyskać tak mnie danych w repeater, ale nie jestem pewien, jak uzyskać listę nazw i jak często się pojawiają.

Chcesz użyć Linq, aby uniknąć pętli danych.

Zgodnie z moimi tagami, jest to rozwiązanie ASP.NET używające C#.

Niektóre wyjaśnienia:
Powiedzmy mam tylko trzy elementy w mojej listy: pkt 1 ma John, Fred, Jack w jego imieniu. Pozycja 2 ma Johna, Freda, Joe w jej nazwach. Pozycja 3 ma Jana w nazwie.

Próbuję zwrócić następujący: Jana - 3 Fred - 2 jack - 1 Joe - 1

także jako notatkę znam konieczności napisać własny comparer dla mojego obiektu , Po prostu brakuje mi "sposobu" na ogólne rozwiązanie w moich myślach.

+1

Witam, kiedy mówisz "jak uzyskać listę nazw i jak często się pojawiają." : czy chcesz policzyć liczbę wystąpień "myobject" na liście , gdzie właściwość .Names zawiera wskaźnik do poprawnej listy (HashSet); innymi słowy, wartość właściwości .Names nie jest zerowa? A może chcesz zbudować nową kolekcję "myObject zawierającą tylko te z vaid HashSet w" .Names property? Proszę o trochę wyjaśnienia. – BillW

+0

Dodano wyjaśnienie. –

Odpowiedz

18

Oto jak rozumiem problem, który próbujesz rozwiązać. Masz listę myobject s. Każdy myobject ma właściwość o nazwie Names, która jest HashSet zs (tj., HashSet<string>). Chcesz policzyć liczbę razy każdy string, który pojawia się w niektórych myobject.Names pojawia się we wszystkich myobject.Names. Oznacza to, że masz

"Alice", "Bob", "Charlie" 
"Alice", "Bob", "Donald" 
"Alice", "Donald", "Ernie" 

jako trzy myobject.Names i chcesz zobaczyć

"Alice", 3 
"Bob", 2 
"Charlie", 1 
"Donald", 2 
"Ernie", 1 

Jeśli tak:

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); 
} 

nie widzę, jaką rolę odgrywa tutaj myobject.ID. Proszę się zakwalifikować.

+0

myobject.ID tak naprawdę nie odgrywa roli, po prostu chciałem wyjaśnić, że nie był to prosty obiekt HashSet. –

+0

OK. Następnie uważam, że powyższe odnosi się do twojego pytania. Daj mi znać, jeśli coś wymaga wyjaśnienia. – jason

+1

Twój przykład ma GroupBy (y), ale s nie istnieje. –

5
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); 
} 
Powiązane problemy