2009-11-05 82 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 

但我在哪裏把排序依據語句,以便它以字母順序列出了呢?

回答

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

(第二種形式是什麼原本在我的回答我,除了我列入「排序依據」空間造成編譯失敗我不知道爲什麼這是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

是的,這是我很感謝 – 2009-11-05 09:54:13

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

慣於這隻訂單中的組通過鑰匙,而不是單個項目後每個鍵? – 2009-11-05 10:00:28

+0

確實;國際海事組織,喬恩(又名託尼小馬)得到了額外的信息... mix'n'match與'Words = group.OrderBy(x => x)'從那裏。 – 2009-11-05 11:02:31

+0

我主要是把這個「按原樣」簡單地通過'into'來顯示替代位置。 – 2009-11-05 11:03:29