列出<t>订购</t>

时间:2010-01-31 14:55:16

标签: c# linq .net-3.5

我有一个问题,我允许用户选择criterea来订购List

让我说我的名单叫做

List<Cars> AllCars = new List<Cars>;
allCars = //call the database and get all the cars

我现在想订购此列表

allCars.orderBy(registrationDate)

我理解上面的内容不起作用,但我没有任何关于我应该放在括号中的内容。

2 个答案:

答案 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。为此,您可以使用上述三种方法之一代理。