0

私はクラスVehicleclass:Carを持っています。以下のようにclass:Vehicleから継承されます。Carクラス(車両の親クラスではない)のプロパティに基づいてLINQを使用して並べ替えたいリストがあります。

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(ParentクラスではなくCarのプロパティ)に基づいてvehicleListを並べ替えます。

以下を試してみましたが、うまくいきません。

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

これを行う方法について何か助けはありますか?

4

6 に答える 6

4

あなたはあなたが欲しいものを決める必要があります:

インスタンスのリストCarまたはインスタンスのリストVehicle

インスタンスのリストが必要な場合はVehicle、のプロパティで並べ替えることはできません。Carリストには、またはが含まれVehiclesている可能性があるためです。 現在試行していること(にキャスト)を実行すると、実行時に例外がスローされる可能性があります。BusBicycle
Car

そうは言っても、それを主張する場合は、次の2つのことに注意する必要があります。

  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);

もちろん、parensを修正して、同じように書くこともできます。

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

Vehicleとは言うものの、リストに。でないものがあれば、上記の両方が爆発しCarます。そしてそれが起こらないのなら、そもそもなぜそれが起こらないList<Car>のでしょうか?

于 2013-02-18T14:38:15.427 に答える
1

ではなく、にキャストする必要がcあります。Carc.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 に答える