【发布时间】:2011-01-20 02:32:01
【问题描述】:
我从一个我想使用 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
}
我真正好奇的是,是否可以使用通用IEnumerable 之外的基于 Lambda 的扩展方法来完成同样的事情。 Google 告诉我,我可以执行以下操作来完成它:
var resultSet = foobarList.OrderBy(x => new {x.Foo, x.Bar})
.Select(x=>x);
但是,如果我这样做,当我点击 foreach 语句时会出现运行时错误。该错误告诉我至少有一个对象必须实现IComparible,我可以看到这一点,因为我对.OrderBy() 方法使用了匿名类型。
那么有没有办法使用 Lambda 方式来完成我想要的?
【问题讨论】:
-
如果您想知道每个可能的查询表达式对应的“流利方法”是什么,请阅读规范的第 7.15.2 节。
-
@Eric Lippert,有一个 C# 3.0 查询表达式翻译备忘单,由 Bart Desmet 编写,我发现它作为快速参考非常有用:bartdesmet.net/blogs/bart/archive/2008/08/30/…。