2010-08-25 2 views
2

J'ai un IEnumerable d'éléments que je voudrais regrouper par catégories associées. Les éléments sont regroupés selon les catégories qui leur sont associées - c'est-à-dire une liste - de sorte qu'un seul élément peut potentiellement faire partie de plusieurs catégories.Éléments de groupe LINQ. Un seul élément peut être dans plusieurs groupes

var categories = numbers.SelectMany(x => x.Categories).Distinct(); 
var query = 
     from cat in categories 
     select new {Key = cat, 
        Values = numbers.Where(n => n.Categories.Contains(cat))}; 

J'utilise le code ci-dessus, et il ne fonctionne en fait, mais je me demandais s'il y avait un moyen plus efficace de faire cela parce que cette opération se produira probablement lentement lorsque le nombre contient des milliers de valeurs.

Je demande à peu près un refactoring du code pour être plus efficace.

Répondre

2

Vous pouvez utiliser les fonctionnalités de regroupement intégrées de LINQ, qui doivent être plus rapides qu'une recherche de type conteneur. Toutefois, comme pour toute question liée aux performances, vous devez vraiment écrire du code pour collecter des statistiques de performance avant de décider comment réécrire le code que vous connaissez. Il se peut qu'il n'y ait aucun problème de performance pour les volumes avec lesquels vous travaillerez.

Donc, voici le code. Ce n'est pas testé, mais quelque chose comme cela devrait fonctionner:

var result = from n in numbers 
      from c in n.Categories 
      select new {Key = c, n.Value} 
      into x group x by x.Key into g 
      select g; 

Chaque groupe contient une clé et une séquence de valeurs qui appartiennent à cette clé:

foreach(var group in result) 
{ 
    Console.WriteLine(group.Key); 
    foreach(var value in group) 
     Console.WriteLine(value); 
} 
Questions connexes