【问题标题】:LINQ OrderBy with more than one field具有多个字段的 LINQ OrderBy
【发布时间】:2010-06-15 17:23:12
【问题描述】:

我有一个需要按两个字段排序的列表。我曾尝试在 LINQ 中使用 OrderBy,但这只允许我指定一个字段。我正在寻找要按第一个字段排序的列表,然后在第一个字段中是否有任何重复项以按第二个字段排序。

例如,我希望结果看起来像这样(按姓氏然后名字排序)。

  • 亚当斯,约翰
  • 史密斯,詹姆斯
  • 史密斯,彼得
  • 汤普森,弗雷德

我已经看到您可以使用 SQL like syntax to accomplish this,但我正在寻找一种使用 OrderBy 方法的方法。

IList<Person> listOfPeople = /*The list is filled somehow.*/
IEnumerable<Person> sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName, aPerson.FirstName); //This doesn't work.

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    你需要使用ThenBy:

    listOfPeople.OrderBy(person => person.LastName)
                .ThenBy(person => person.FirstName)
    

    【讨论】:

    【解决方案2】:

    如果您想使用方法语法,请使用ThenBy(),正如其他人建议的那样:

    listOfPeople.OrderBy(person => person.LastName)
                .ThenBy(person => person.FirstName)
    

    在查询语法中,几乎可以按照您想要的方式完成相同的操作:两个排序键,用逗号分隔:

    from person in listOfPeople
    orderby person.LastName, person.FirstName
    select person
    

    上面的代码实际上会被编译成使用OrderBy()ThenBy()的代码,就像第一个例子一样。

    另外,如果您希望 OrderBy() 具有两个(或更多)排序键,您当然可以将其写为 IEnumerable&lt;T&gt; 上的扩展方法,内部调用 OrderBy()ThenBy()

    【讨论】:

      【解决方案3】:

      您的后续字段应使用 ThenBy() 方法进行排序

      【讨论】:

        【解决方案4】:

        使用.ThenBy(aPerson=&gt;field2);

        【讨论】:

          【解决方案5】:
          var sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName).ThenBy(a => aPerson.FirstName);
          

          【讨论】:

            【解决方案6】:

            更多字段的排序方法如下:

            var soterdList = initialList.OrderBy(x => x.Priority).
                                                ThenBy(x => x.ArrivalDate).
                                                ThenBy(x => x.ShipDate);
            

            您可以使用 clasole "ThenBy" 添加其他字段

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-06-06
              • 2020-12-25
              • 2015-02-25
              • 1970-01-01
              • 2016-03-15
              • 1970-01-01
              相关资源
              最近更新 更多