2010-06-15 48 views
2

好了,我有一個表OrderBy羣組後?

Table: 
Id 
Value 

如果我詢問我的表,組我的結果通過「價值」我怎樣才能使它所以每個組都按字母順序排列(由「價值」分組而成的羣=「a」將出現在由「值」=「z」分組的組之前)。

My current query looks something like this: 
var Result = 
from a in DB.Table 
orderby a.Value 
group by a.Value into b 
select new {Groupz = b}; 

回答

3

其他的答案被訂購初步名單,然後排序組。這是有效的,因爲GroupBy保留了初始集合的順序。不過,如果你想實際訂購組(這是原來的問題),要由IGrouping對象的重點首先創建組,然後順序:

[Test] 
    public void Test() 
    { 
     var collection = new List<Fake>() 
          { 
           new Fake {Value = "c"}, 
           new Fake {Value = "b"}, 
           new Fake {Value = "a"}, 
           new Fake {Value = "a"} 
          }; 
     var result = 
      collection.GroupBy(a => a.Value, a => a).OrderBy(b => b.Key).ToList(); 

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

    private class Fake 
    { 
     public string Value { get; set; } 
    } 

使用查詢語法,這看起來像這樣:

 var result = 
      from a in collection 
      group a by a.Value 
      into b 
      orderby b.Key 
      select b; 

我們再次手術手術從事羣體訂單之前,和該組實際執行的順序,而不是原來的列表元素。

+0

+1我喜歡你的'collection.GroupBy'表達式解決方案。 – 2010-06-15 18:17:34

+0

按鍵排序似乎沒有按字母排序數據... 它通過Id訂購它 – sooprise 2010-06-15 18:22:01

+0

@Soo - 我不確定你的意思。當我運行上面的代碼時,我看到:控制檯上的「a b c」(單獨行)。我相信代碼正確地命令返回的「結果」集合中的組。你看到不同的東西嗎?你可以發佈一個更完整的代碼示例來解釋你的問題嗎? – 2010-06-15 18:26:50

0

嘗試:

var result = from a in DB.Table 
      orderby a.Value 
      group a by a.Value into b 
      select b; 

編輯:

使用上面的查詢一些示例代碼:

static void Main(string[] args) 
     { 
      var s = new List<Animal> 
         { 
          new Animal {Value = "Zebra"}, 
          new Animal {Value = "Zebra"}, 
          new Animal {Value = "Cobra"}, 
          new Animal {Value = "Apple"} 
         }; 

      var result = from a in s 
         orderby a.Value 
         group a by a.Value into b 
         select b; 

      foreach (var group in result) 
      { 
       foreach (var animal in group) 
       { 
        Console.WriteLine(animal.Value); 
       } 
      }    
     } 


class Animal 
{ 
    public string Value { get; set;} 
}