我有一个问题,我允许用户选择排序列表的标准
假设我的列表被称为
List<Cars> AllCars = new List<Cars>;
allCars = //call the database and get all the cars我现在想要订购这个清单
allCars.orderBy(registrationDate)我知道上面的方法不起作用,但是我不知道我应该在括号里放什么。
发布于 2010-01-31 22:56:54
allCars.OrderBy(c => c.RegistrationDate);发布于 2010-01-31 23:13:21
我知道上面的方法不起作用,但我不知道应该把什么放在括号里。
Enumerable.OrderBy的声明是
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector
)而且,因为它是一个扩展方法,所以可以像这样调用它
source.OrderBy(keySelector).您的List<Car>正在扮演source作为List<T> : IEnumerable<T>的角色。第二个参数更有趣,也是让您感到困惑的参数。它被声明为
Func<TSource, TKey>这意味着它是一个代理,它获取TSource的实例(在本例中为Car)并返回TKey的实例;您可以决定TKey是什么。您已经声明要按Car.registrationDate排序,因此听起来TKey就是DateTime。现在,我们如何获得这些委托中的一个?
在过去,我们可以说
DateTime GetRegistrationDate(Car car) {
return car.registrationDate;
}并像这样使用OrderBy:
allCars.OrderBy(GetRegistrationDate).在C# 2.0中,我们获得了使用匿名委托的能力;这些委托没有名称,并且是就地定义的。
allCars.OrderBy(delegate(Car car) { return car.registrationDate; });然后,在C# 3.0中,我们获得了使用λ表达式的能力,这是一种非常特殊的匿名委托,具有紧凑的表示法
allCars.OrderBy(car => car.registrationDate);这里,c => c.registrationDate是lambda表达式,它表示一个Func<Car, DateTime>,而不是Enumerable.OrderBy中的第二个参数。
allCars.orderBy(registrationDate)
这不起作用的原因是因为registrationDate不是一个委托。事实上,在没有任何上下文的情况下,registrationDate对编译器来说是没有意义的。它不知道你是指Car.registrationDate,还是可能是ConferenceAttendee.registrationDate,或者谁知道是什么。这就是为什么您必须为编译器提供额外的上下文,并告诉它您需要Car.registrationDate属性。为此,您可以通过上面提到的三种方式之一使用委托。
https://stackoverflow.com/questions/2172095
复制相似问题