Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分组及;linq中的排序_C#_Linq - Fatal编程技术网

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;