2009-11-05 2 views
3

этот код:Где я могу поставить «orderby group.key» в этой инструкции 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); 
    }); 

выводит это:

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

Но где же я положил заявление OrderBy так, чтобы в нем перечислены в алфавитном порядке?

ответ

2

Предпочитаете, что вы хотите заказать обе группы и слова в группе? Попробуйте это:

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(); 

или:.

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(); 

(Вторая форма, что я первоначально имел в своем ответе, за исключением того, я включил место в «OrderBy», который вызвал сбой компиляции я задавался вопросом, почему что было Doh)

конечно, вы могли бы сделать все это в одном дот заявлении нотации тоже:.!

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

да, то есть то, что я был после того, как благодаря –

1

Два варианта:

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

или использовать into и повторно выберите:

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

Привычка это только порядка группы по ключу, а не отдельные элементы в пределах каждый ключ? –

+0

Действительно; ИМО, Джон (он же Тони Пони) получил дополнительную информацию ... mix'n'match с 'Words = group.OrderBy (x => x)' оттуда. –

+0

Я в основном оставил это «как есть», просто чтобы показать альтернативное местоположение через 'in'. –

Смежные вопросы