LINQ - ThenBy、ThenByDescending

LINQ - ThenBy、ThenByDescending

上一篇【Generic List Sorting in C# 3.0】講到只要有繼承 IEnumerable 介面或是 IEnumerable<T> 介面,現在都內建 OrderBy OrderByDescending Extension Methods 新功能。但是如果該欄位的值相等,要繼續比較其他的指定欄位,就需要 ThenByThenByDescending 囉。

(1) 一樣建立 Product 類別作為示範,該類別擁有 int 型態的 ID 屬性string 型態的 Name 屬性double 型態的 Pricce 屬性DateTime 型態的 ShipDate 屬性覆寫 ToString() 方法方便我們列印。

(2) 利用 Collection Initializers 建立實例

   1:  var pList = new List<Product>
   2:              {
   3:                      new Product {ID = 1, Name = "A", Price = 19, ShipDate = new DateTime(2006, 1, 19)}, 
   4:                      new Product {ID = 7, Name = "C", Price = 17, ShipDate = new DateTime(2006, 10, 17)}, 
   5:                      new Product {ID = 7, Name = "B", Price = 17, ShipDate = new DateTime(2007, 2, 12)}, 
   6:                      new Product {ID = 5, Name = "D", Price = 237, ShipDate = new DateTime(2005, 9, 11)}
   7:              };

(3) 直接進入範例:

   1:  // 依照 ID 欄位升冪排序、在依 Name 欄位升冪排序
   2:  foreach (var product in pList.OrderBy(p => p.ID).ThenBy(p => p.Name))
   3:  {
   4:      Console.WriteLine(product.ToString());
   5:  }
   6:  Console.WriteLine();
   7:   
   8:  // 依照 ID 欄位升冪排序、在依 Price 欄位降冪排序、在依 Price 欄位升冪排序
   9:  foreach (var product in pList.OrderBy(p => p.ID).ThenByDescending(p => p.Price).ThenBy(p => p.ShipDate))
  10:  {
  11:      Console.WriteLine(product.ToString());
  12:  }
  13:  Console.WriteLine();

(4) 輸出結果:

   1:  // 依照 ID 欄位升冪排序、在依 Name 欄位升冪排序
   2:  ID: 1, Name: A, Price: 19, ShipDate: 2006/1/19
   3:  ID: 5, Name: D, Price: 237, ShipDate: 2005/9/11
   4:  ID: 7, Name: B, Price: 17, ShipDate: 2007/2/12
   5:  ID: 7, Name: C, Price: 17, ShipDate: 2006/10/17
   6:   
   7:  // 依照 ID 欄位升冪排序、在依 Price 欄位降冪排序、在依 Price 欄位升冪排序
   8:  ID: 1, Name: A, Price: 19, ShipDate: 2006/1/19
   9:  ID: 5, Name: D, Price: 237, ShipDate: 2005/9/11
  10:  ID: 7, Name: C, Price: 17, ShipDate: 2006/10/17
  11:  ID: 7, Name: B, Price: 17, ShipDate: 2007/2/12