【问题标题】:Grouping & Sorting in linqlinq中的分组和排序
【发布时间】:2011-05-01 19:30:41
【问题描述】:

我有一个客户列表,我需要根据业务规则对列表进行排序和分组。

  • 按客户名称分组
  • 按客户名称的字母顺序排序
  • 如果同名有多个结果,则需要按出生日期升序排序(最早的排在最前面)

下面是实体。

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));

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您的业务规则有些冲突: 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);
    

    【讨论】:

    • 第三条规则是针对如果列表中有多个同名客户的情况。当时按出生日期排序。
    • 正如我之前提到的 - 如果您有多个同名客户,他们将被归为一组。但是如果你不想“合并”它们,你真的不需要GroupBy - 只需使用OrderBy(...).ThenBy(...).ThenBy(...)。顺便说一句,您期望什么样的输出?如果你想要一个平面列表 - 在我的查询中使用 ToList(),如果你想要,例如,List<IGrouping<Customer>> - 将 ToList() 应用于 Mark Heath 的答案。
    【解决方案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;
    

    【讨论】:

    • 你真的不需要名字之间的空格,是吗?
    • @Yakimych 很好,它使 group.Key 看起来更好一点
    【解决方案3】:
    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);
    

    【讨论】:

      猜你喜欢
      • 2013-06-21
      • 2010-11-24
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      相关资源
      最近更新 更多