0

我有类Vehicleclass:Car是从class:Vehicle继承的,如下所示。我有一个列表,我想使用LINQ基于 Car 类(不是车辆父类)的属性对其进行排序。

class vehicle
{
    public String Name {get; set; }
}

class Car:Vehicle
{
    public String ModelName {get; set; }
}

List<Vehicle> vehicleList=new List<Vehicle>();

Car c1 = new Car();
vechicleList.Add(c1); //s note that i am adding **Car** objects

Car c2 = new Car();
vechicleList.Add(c2);
// added 10 such Car objects

然后我想根据 CarModel 对车辆列表进行排序(这是 Car 的属性,而不是 Parent 类的属性)

我尝试了下面的一个,但它不起作用。

vehicleList.OrderBy(c => (Car)c.ModelName)

有关如何执行此操作的任何帮助?

4

6 回答 6

4

你必须决定你想拥有什么:

实例列表CarVehicle实例列表。

如果您想要一个Vehicle实例列表,则不能按 的属性排序Car,因为在列表中Vehicles也可能有 aBus或 a Bicycle
执行您当前尝试的操作(转换为Car)可能会在运行时引发异常。

话虽如此,如果您坚持这样做,则必须注意两件事:

  1. 你需要修复你的演员表:vehicleList.OrderBy(c => ((Car)c).ModelName)
  2. 您需要注意OrderBy不执行就地排序。vehicleList仍将保持其原始顺序。如果要在 中获得有序结果vehicleList,则需要将结果分配OrderBy给它:

    vehicleList = vehicleList.OrderBy(c => ((Car)c).ModelName).ToList();
    
于 2013-02-18T14:39:18.017 回答
3

做你想做的最易读的代码是

vehicleList.Cast<Car>().OrderBy(c => c.ModelName);

当然,您也可以修复括号并编写相同的内容

vehicleList.OrderBy(c => ((Car)c).ModelName);

也就是说,如果Vehicle您的列表中有任何不是Car. 如果这不能发生,那为什么不List<Car>首先呢?

于 2013-02-18T14:38:15.427 回答
1

你必须投进c一个Car,不是c.ModelName

尝试 :

vehicleList.OrderBy(c => ((Car)c).ModelName)
于 2013-02-18T14:37:54.257 回答
0

尝试使用:

vehicleList.OfType<Car>().OrderBy(c=>c.ModelName)

注意:这只会返回您列表中的汽车

于 2013-02-18T14:39:08.840 回答
0

尝试这个:

vehicleList.OrderBy(c=>((Car)c).ModelName)

但请注意,如果物品实际上不是汽车,它会爆炸!

一种解决方法是:

vehicleList.OrderBy<Vehicle, string>(c=>
{
    Car car = c as Car;
    if (car != null)
        return car.ModelName
    else
        return "";
}

但如果有“非汽车”,则位置将由空字符串相对于列表中的其他项目确定。

于 2013-02-18T14:39:42.080 回答
0
vehicleList.OfType<Car>().OrderBy(c=>c.ModelName)
于 2013-02-18T14:40:22.593 回答