2009-02-26 6 views
3

J'ai deux classes:C# Sélectionner les valeurs Distinct de IGrouping

class Foo 
{ 
    public Bar SomeBar { get; set; } 
} 

class Bar 
{ 
    public string Name { get; set; } 
} 

J'ai une liste de Foos ce groupe I ainsi:

var someGroup = from f in fooList 
       orderby f.SomeBar.Name ascending 
       group f by f.SomeBar.Name into Group 
       select Group; 

Comment puis-je obtenir la liste des barres distinctes de someGroup?

Répondre

7

Y aura-t-il potentiellement plus d'une barre portant le même nom? Si c'est le cas, c'est difficile. Sinon, vous pouvez simplement changer à:

var grouped = from f in fooList 
       orderby f.SomeBar.Name ascending 
       group f by f.SomeBar into Group 
       select Group; 

var bars = grouped.Select(group => group.Key); 

Sinon, si vous voulez seulement un bar par nom, vous pouvez coller avec votre requête initiale, mais changer le dernier bit:

var someGroup = from f in fooList 
       orderby f.SomeBar.Name ascending 
       group f by f.SomeBar.Name into Group 
       select Group; 

var bars = someGroup.Select(group => group.First().SomeBar); 

Cela prendra le premier Foo dans chaque groupe, et trouver sa barre.

0

Si vous définissez « étant distincte » par une Equals spéciale mise en œuvre pour Bar, vous pouvez utiliser:

var result = someGroup.SelectMany(x => x.Select(t => t.SomeBar)).Distinct(); 
0

Les gens ont posé des questions similaires avant, j'ai donc fait la connaissance de cette combinaison tout le monde:

var newlist<T2> = oldlist<T1>.GroupBy(g => g.distinct_var).Select(g => g.First()) //a 
       .Select(r=> new T2() {var1=r.va1, var2=r.var2 ...etc}).ToList(); //b 

Ce qu'il fait:

a. La première ligne sélectionne les éléments distincts de votre choix, ce que vous vouliez.

b. La deuxième ligne convertit l'ancien type1 en nouveau type2 en construisant la nouvelle liste T2.

Peut-être surpeuplé pour votre question, il suffit de couper les choses dont vous n'avez pas besoin.

Questions connexes