我有一个问题,我允许用户选择criterea来订购List
让我说我的名单叫做
List<Cars> AllCars = new List<Cars>;
allCars = //call the database and get all the cars
我现在想订购此列表
allCars.orderBy(registrationDate)
我理解上面的内容不起作用,但我没有任何关于我应该放在括号中的内容。
答案 0 :(得分:5)
allCars.OrderBy(c => c.RegistrationDate);
答案 1 :(得分:1)
我理解上面的内容不起作用,但我没有任何关于我应该放在括号中的内容。
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中,我们获得了使用lambda表达式的能力,这是一种非常特殊的匿名委托,带有紧凑的表示法
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
。为此,您可以使用上述三种方法之一代理。