2010-10-28 66 views
2

我有一個客戶名單,我需要根據業務規則對列表進行排序和分組。linq分組和排序

  • 組由客戶名稱
  • 排序按字母順序
  • 如果有相同名稱的幾個結果,那麼就需要通過出生日期進行升序排序(最老的上市客戶名稱第一個)

下面是實體。

public class Customer 
{ 
public string FirstName {get; set;} 
public string LastName {get; set;} 
public DateTime DateofBirth {get; set;} 
} 

在此先感謝。

customers.GroupBy(c => c.FirstName) 
.Select(c => c.OrderBy(c => c.FirstName).ThenBy(c => c.LastName)); 

回答

2

你的業務規則是有點矛盾的: Group by Customer Name意味着你不會有相同的名字多次出現在結果列表中。然而你的第三條規則是if there are several results for the same name, then they need to sorted by date of birth。所以,如果在規則#1分組你的意思是排序,您的查詢將僅僅是:

customers.OrderBy(c => c.FirstName). 
      ThenBy(c => c.LastName). 
      ThenBy(c => c.DateofBirth); 

如果你真正的意思是分組規則#3成爲標準組中選擇元素 - 在這種情況下,最早的客戶將選擇對於每個組:

customers.GroupBy(c => c.FirstName + c.LastName). 
      Select(g => g.OrderBy(c => c.DateofBirth).FirstOrDefault()). 
      OrderBy(c => c.FirstName). 
      ThenBy(c => c.LastName); 
+0

第三個規則是情況下,如果列表中有更多的一個客戶有相同的名稱。那時按DateofBirth排序。 – 2010-10-28 11:56:41

+0

正如我前面提到的 - 如果您有多個同名客戶,他們將被分組爲一個。但是如果你不想'合併'它們,你並不需要'GroupBy' - 只需使用'OrderBy(...)。ThenBy(...)。ThenBy(...)'。你期望什麼樣的輸出,順便說一句?如果你想要一個簡單的列表 - 在我的查詢中使用'ToList()',如果你想要,例如'List >' - 應用'ToList()'給Mark Heath的答案。 – Yakimych 2010-10-28 12:46:23

0
var sortList = (from c in customers 
          group c by new 
          { 
           c.FirstName, 
           c.LastName, 
           c.DateofBirth 
          } into g 
          select new Customer() 
          { 
           FirstName = g.Key.FirstName, 
           LastName = g.Key.LastName, 
           DateofBirth = g.Key.DateofBirth 
          }).OrderBy(x => x.FirstName) 
          .ThenBy(x=> x.LastName) 
          .ThenBy(x=> x.DateofBirth); 
2

這似乎有點奇怪,以客戶的名義組,但是這將做到這

var groups = from c in customers 
       let name = c.FirstName + " " + c.LastName 
       orderby name ascending, c.DateofBirth ascending 
       group c by name into g 
       select g; 
+0

你真的不需要名稱之間的空間,是嗎? – Yakimych 2010-10-28 10:56:27

+0

@Yakimych以及它使組。鍵看起來更好一點 – 2010-10-28 11:01:26