使用LINQ进行多重排序

264

我从一个基本的类开始,想要使用LINQ在列表中进行操作,就像以下示例:

public class FooBar   
{  
    public virtual int Id { get; set; }  
    public virtual string Foo { get; set; }  
    public virtual string Bar { get; set; }
}

这就是我最终发现的使用非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  
}

我真正好奇的是是否可以使用基于Lambda表达式的扩展方法,从泛型 IEnumerable 实现同样的功能。Google告诉我可以尝试以下代码实现:

var resultSet = foobarList.OrderBy(x => new {x.Foo, x.Bar})  
                          .Select(x=>x);

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

那么,有没有一种使用Lambda方式实现我想要的功能的方法呢?


3
如果您想了解每个可能的查询表达式所对应的“流畅方法”,请阅读规范的第7.15.2��。 - Eric Lippert
2
@Eric Lippert,这里有一份C# 3.0查询表达式翻译速查表,由Bart Desmet编写,我发现它非常有用作为快速参考:http://bartdesmet.net/blogs/bart/archive/2008/08/30/c-3-0-query-expression-translation-cheat-sheet.aspx。 - Pop Catalin
1个回答

604

11
在提问之前,我想完全了解API的内容。此外,看起来你可以根据需要多次链接.ThenBy()语句。再次感谢! - sdanna
33
关于 .AndThen() 怎么样? - Brock Hensley
86
不要使用 .AndThen() 方法! - Valamas
7
(function AndThen() { AndThen() })()这是一个递归函数调用的示例。该函数名为 "AndThen",在函数内部调用自身,以实现递归。括号中的第二个 "AndThen()" 表示对函数的调用。 - masteroleary
5
注意:.OrderBy().ThenBy()返回的是IOrderedEnumerable类型,它不会修改原始对象。因此,您需要将其分配给一个变量,并以ToList()结束,以便在其他地方使用新的排序列表。 - Kurtis Jungersen
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接