按名称和日期排序,每组按日期排序

本文关键字:排序 日期 | 更新日期: 2023-09-27 18:13:35

我有以下表格:
名日期
10/04/2016
10/03/2016
10/05/2016
B 10/02/2016
B 10/01/2016
B 10/03/2016
C 10/05/2016
C 10/02/2016
C 10/04/2016

我想显示这个
名日期
B 10/01/2016
B 10/02/2016
B 10/03/2016
C 10/02/2016
C 10/04/2016
C 10/05/2016
10/03/2016
10/04/2016
A 10/05/2016

如何创建查询以获得此结果。

按名称和日期排序,每组按日期排序

var elements = new[]
{
    new { Name = "A", Date = DateTime.Parse("10/04/2016") },
    new { Name = "A", Date = DateTime.Parse("10/03/2016") },
    new { Name = "A", Date = DateTime.Parse("10/05/2016") },
    new { Name = "B", Date = DateTime.Parse("10/02/2016") },
    new { Name = "B", Date = DateTime.Parse("10/01/2016") },
    new { Name = "B", Date = DateTime.Parse("10/03/2016") },
    new { Name = "C", Date = DateTime.Parse("10/05/2016") },
    new { Name = "C", Date = DateTime.Parse("10/02/2016") },
    new { Name = "C", Date = DateTime.Parse("10/04/2016") },
};
// LINQ to Objects
elements
    .GroupBy(e => e.Name)                         // grouping by name                
    .Select(group => group.OrderBy(e => e.Date))  // order elements by date      
    .OrderBy(group => group.First().Date)         // order groups by date
    .SelectMany(group => group);                  // compose groups 
// LINQ to Entities
elements
    .GroupBy(e => e.Name)
    .Select(group => group.OrderBy(e => e.Date))
    .OrderBy(group => group.FirstOrDefault().Date)                   
    .AsEnumerable()
    .SelectMany(group => group);

您可能不需要groupby,但只有orderby才能完成您的任务:

yourList.OrderBy(l => l.Date).ThenBy(l => l.Name)

如果您能提供更多信息就太好了。例如,包含数据的对象类型。它是自定义模型还是DataTable?无论如何,我都要试一试。

var result = dataTable.Rows.AsEnumerable().GroupBy(x => x.Name).OrderBy(x => x.Date);

var result = Foo.GroupBy(x => x.Name).OrderBy(x => x.Date);

https://dotnetfiddle.net/0SfhAz

这是对代码的摆弄。由于某些原因,我无法让小提琴写出列表中的值。

我最初是在LinqPad中这样做的,下面是我在LinqPad

中从小提琴中的代码中得到的输出
  1. b 10/1/2016
  2. b 10/2/2016
  3. b 10/3/2016
  4. c 10/2/2016
  5. c 2016/10/4
  6. c 10/5/2016
  7. a 2016年3月10日
  8. 2016年4月10日2016/10/5

我不知道为什么我不能在。net小提琴上做一个writeline,但这很困难。如果提琴不能为您工作,这里是我使用的linq查询

var orderedList = originalList。order (x => x. somedate)。GroupBy(y => y. name);

可能有更好的方法,但这看起来解决了你的问题