使用LINQ进行多次排序

sda*_*nna 216 c# linq lambda

我从一个基本类开始,我想使用LINQ在List中操作,如下所示:

public class FooBar   
{  
    public virtual int Id { get; set; }  
    public virtual string Foo{ get; set; }  
    public virtual string Bar{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我最终发现使用非lambda LINQ的东西来解决我的问题.

// code somewhere else that works and gets the desired results  
var foobarList = GetFooBarList();  // Abstracted out - returns List<Foobar>  

// Interesting piece of code that I want to examine
var resultSet = from foobars in foobarList  
                orderby foobars.Foo, foobars.Bar  
                select foobars;

// Iterate and do something interesting  
foreach (var foobar in resultSet)  
{  
    // Do some code  
}
Run Code Online (Sandbox Code Playgroud)

我真正好奇的是,如果使用基于Lambda的扩展方法从通用IEnumerable完成相同的事情可以实现相同的目的.谷歌告诉我,我可以采取以下措施来完成它

var resultSet = foobarList.OrderBy(x => new {x.Foo, x.Bar})  
                          .Select(x=>x);
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做,当我点击foreach语句时,我会收到运行时错误.该错误告诉我至少有一个对象必须实现IComparible,我可以看到,因为我正在使用.OrderBy()方法的匿名类型.

那么有没有办法用Lambda方式实现我想要的东西?

Pop*_*lin 500

您可以使用ThenByThenByDescending扩展方法:

foobarList.OrderBy(x => x.Foo).ThenBy( x => x.Bar)
Run Code Online (Sandbox Code Playgroud)

  • "不.然后()!" (72认同)
  • 怎么样`.AndThen()` (26认同)
  • 我拒绝玩你的LINQ心灵游戏! (11认同)
  • 猜测我应该在询问问题之前完全通过API;)看起来你也可以根据需要链接.ThenBy()语句.再次感谢! (7认同)
  • (function AndThen(){AndThen()})() (7认同)
  • 注意:`.OrderBy()` 和 `.ThenBy()` 返回一个 IOrderedEnumerable,它**不**修改原始对象。因此,您需要分配给一个变量并以“ToList()”结尾,以便在其他地方使用新的有序列表。 (7认同)
  • 有点惭愧的是,我在6年的开发过程中竟然不知道这一点…… (2认同)