2009-11-05 1 views
3

ce code:Où dois-je mettre le "orderby group.key" dans cette déclaration LINQ?

string[] words = {"car", "boy", "apple", "bill", "crow", "brown"}; 

var groups = from w in words 
    group w by w[0] into g 
    select new {FirstLetter = g.Key, Words = g}; 
    //orderby ???; 

var wordList = groups.ToList(); 
//var wordList = groups.ToList().OrderBy(???); 

wordList.ForEach(group => 
    { 
     Console.WriteLine("Words that being with {0}:", 
        group.FirstLetter.ToString().ToUpper()); 
     foreach(var word in group.Words) 
      Console.WriteLine(" " + word); 
    }); 

sorties ceci:

Words that being with C: 
    car 
    crow 
Words that being with B: 
    boy 
    bill 
    brown 
Words that being with A: 
    apple 

Mais où dois-je mettre la déclaration orderby pour qu'il énumère dans l'ordre alphabétique?

Répondre

2

Je suppose que vous voulez commander à la fois les groupes et les mots au sein du groupe? Essayez ceci:

var groups = from w in words 
    group w by w[0] into g 
    select new { FirstLetter = g.Key, Words = g.OrderBy(x => x) }; 

var wordList = groups.OrderBy(x => x.FirstLetter).ToList(); 

ou:.

var groups = from w in words 
    group w by w[0] into g 
    orderby g.Key 
    select new { FirstLetter = g.Key, Words = g.OrderBy(x => x) }; 

var wordList = groups.ToList(); 

(La deuxième forme est ce que j'avais à l'origine dans ma réponse, sauf que j'inclus un espace dans « orderby » qui a provoqué un échec de la compilation Je me demandais pourquoi qui était Doh)

Bien sûr, dans une instruction de notation de points que vous pouvez faire tout cela aussi.!

var wordList = words.GroupBy(word => word[0]) 
         .OrderBy(group => group.Key) 
         .Select(group => new { FirstLetter = group.Key, 
               Words = group.OrderBy(x => x) }) 
         .ToList(); 
+0

oui, c'est-ce que je cherchais grâce –

1

Deux choix:

var groups = from w in words 
    group w by w[0] into g 
    orderby g.Key 
    select new {FirstLetter = g.Key, Words = g}; 

ou utiliser into et resélectionnez:

var groups = from w in words 
      group w by w[0] into g 
      select new { FirstLetter = g.Key, Words = g } into grp 
      orderby grp.FirstLetter 
      select grp; 
+0

Wont cette commande que les groupes de clés, et pas les éléments individuels à l'intérieur chaque clé? –

+0

En effet; IMO, Jon (alias Tony le poney) a eu l'info supplémentaire ... mix'n'match avec le 'Words = group.OrderBy (x => x)' de là. –

+0

J'ai principalement laissé ce "tel quel" simplement pour montrer l'emplacement alternatif via 'into'. –