2009-09-30 4 views
2

J'ai le code suivant:Comment accéder à des valeurs groupées renvoyées par une requête LINQ

List<Person> people = new List<Person> 
    { 
     new Person{ Id = 1, Name = "Bob"}, 
     new Person{ Id = 2, Name = "Joe"}, 
     new Person{ Id = 3, Name = "Bob"} 
    }; 

    var peopleGroupedByName = from p in people 
           group p by p.Name; 

    //get all groups where the number of people in the group is > 1 

Pour la vie de moi je ne peux pas comprendre comment travailler avec les valeurs renvoyées par la requête LINQ être capable de filtrer ensuite tous les groupes qui ont été retournés de sorte que je n'ai que les groupes qui ont plus d'un élément.

En ce moment je me casse la tête contre un mur et je ne peux pas vraiment penser aux mots-clés à utiliser dans une recherche google afin de me débrouiller par moi-même.

J'apprécierais vraiment toute aide sur la façon de faire cela dans Linq car il semble que ce devrait être très simple à faire.

Répondre

6
List<Person> people = new List<Person> { 
    new Person{ Id = 1, Name = "Bob"}, 
    new Person{ Id = 2, Name = "Joe"}, 
    new Person{ Id = 3, Name = "Bob"} 
}; 

var peopleGroupedByName = from p in people 
          group p by p.Name into peopleGroup 
          where peopleGroup.Count() > 1 
          select peopleGroup; 

//get all groups where the number of people in the group is > 1 

Alternativement, where peopleGroup.Skip(1).Any() comme Mehrdad a suggéré sera généralement offrir de meilleures performances avec LINQ aux objets depuis Count() itère sur le contenu de l'ensemble du groupe, et Skip(1).Any() simplement au cours des 2 premiers éléments - (voir son commentaire pour plus de détails ; Count convient aux clauses group-by).

En plus: Pour faciliter la lecture, je préfère utiliser systématiquement la syntaxe, de la méthode d'extension .GroupBy(... ou la syntaxe de requête group ... by ... into ... mais pas les deux.

+1

ah! dans! bien sûr! c'est ce qui me manquait! merci Eamon. – mezoid

+1

Eamon: Re '.Skip (1) .Any()': il * généralement * améliore les performances. Pour être précis, si la collection n'implémente pas ICollection 'et fournit une propriété' Count' qui retourne le nombre dans O (1), elle améliore les performances. Cependant, dans ce cas précis, la classe 'Grouping', qui est une classe' internal' dans 'System.Core', implémente' Count' comme O (1), donc '.Count()> 1' est préférable. –

+0

Merci pour les informations détaillées! –

2
var peopleGroupedByName = people.GroupBy(p => p.Name) 
           .Where(g => g.Count() > 1); 

var peopleGroupedByName = from p in people 
          group p by p.Name into g 
          where g.Count() > 1 
          select g; 
+0

Est-il possible de le faire dans la syntaxe de compréhension? – mezoid

+0

Oui, bien sûr. Ajoutez simplement 'où g.Count()> 1' à votre requête. –

0

C'est en fait assez facile.

var filtererGroups = people 
    .GroupBy(p => p.Name) 
    .Where(grp => grp.Count() > 1); 

Pour filtrer par clé vous feriez quelque chose comme ça.

var filtererGroups = people 
    .GroupBy(p => p.Name) 
    .Where(grp => grp.Key == "Bob"); 
Questions connexes