2011-10-10 4 views
-7

Je dois trouver la personne qui a le maximum d'éléments dans une liste comme ceci:LINQ: Howto obtenir le nombre de personnes par personid

class Person 
{ 
    var personid; 
    var personname; 
    var blah; 
} 

List<Person> people = new List<Person>(); 

Liste des échantillons

1 John 
1 John 
1 John 
2 Smith 
1 John 

Sample résultat

1 3 (id, count) 

Exemple de résultat bonus -avec la clause N Top

1 3 
2 1 

Plus; Top N clause serait bien si tout/built-in. Je voudrais apprendre les deux versions; avec ou sans clause Top.

+2

Nombre maximum d'éléments de quoi? Est-ce que 'blah' est une collection? –

+1

Question mal formulée désolé -1. – JonH

+0

@Marcelo Cantos: Merci pour le formatage, il semble génial. J'ai écrit à la hâte, désolé. –

Répondre

1

Max:

var biggestGrpOfPeopleHavingSamePersonId = 
people.GroupBy(x => x.personid).Max(x => x.Count()); 

Top:

var top3peopleGroups = 
people.GroupBy(x => x.personid).OrderByDescending(x => x.Count()).Take(3); 

EDIT:

La première requête renvoie un élément de type IGrouping<TKey,TValue>TKey est du même type de personid et TValue est de type Person. La seconde requête renvoie un IEnumerable<> d'objets comme ça.

Ainsi, par exemple, dans le second cas, vous pouvez faire:

foreach(var g in top3peopleGroups) 
{ 
    Console.WriteLine("Person Id: " + g.Key + ", Count: " + g.Count()); 
} 
+0

Une petite faute de frappe, en fait c'est OrderByDescendant;) Correction – digEmAll

+0

Ce sera une sorte de top-list. Maintenant, je connais le compte le plus élevé, mais comment puis-je déterminer qui est la personne? –

+0

http://stackoverflow.com/questions/454601/how-to-count-duplicates-in-list-with-linq –

1

Je ne comprends pas la première partie de la question. Quelle liste?

Pour la deuxième partie: Le linq équivalent à TOP dans SQL est Take(). Combinez-le avec Skip() pour obtenir les X lignes suivantes des résultats.

Questions connexes