C# 分组及;linq中的排序
我有一个客户列表,我需要根据业务规则对列表进行排序和分组C# 分组及;linq中的排序,c#,linq,C#,Linq,我有一个客户列表,我需要根据业务规则对列表进行排序和分组 按客户名称分组 按客户名称按字母顺序排序 如果同一姓名有多个结果,则需要按出生日期升序排序(最早的列在前面) 下面是实体 public class Customer { public string FirstName {get; set;} public string LastName {get; set;} public DateTime DateofBirth {get; set;} } 提前谢谢 customers.Gr
- 按客户名称分组
- 按客户名称按字母顺序排序
- 如果同一姓名有多个结果,则需要按出生日期升序排序(最早的列在前面)
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));
您的业务规则有些冲突:
按客户名称分组
意味着您不会在结果列表中多次出现相同的名称。然而,第三条规则是,如果同一个名字有多个结果,那么它们需要按出生日期排序。因此,如果在规则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);
按客户名称分组似乎有点奇怪,但这样就可以了
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;
你真的不需要名字之间的空格,是吗?@Yakimych好吧,这会让这个组看起来更好。第三条规则适用于名单上有多个名字相同的客户的情况。当时,按出生日期排序。正如我前面提到的,如果您有多个同名客户,他们将被分组为一个客户。但是如果你不想“合并”它们,你并不需要一个GroupBy
——只要使用OrderBy(…).ThenBy(…).ThenBy(…).ThenBy(…)
。顺便说一句,你希望得到什么样的产出?如果你想要一个简单的列表-在我的查询中使用ToList()
,如果你想要的话,例如,list
-应用ToList()
标记Heath的答案。
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;