2013-02-18 96 views
0

我有班級車輛等級:車輛繼承自類別:車輛如下所示。我有一個列表,我想使用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 vehicleList(這是汽車的屬性,而不是父類)

我想下面的一個,但它不工作。

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

有關如何做到這一點的任何幫助?

+2

爲什麼如果你需要'List '''List '? – 2013-02-18 14:38:56

+0

@TimSchmelter我正在處理一些遺留代碼。並有限制改變.. :( – user2025418 2013-02-18 17:48:19

回答

3

,你想要做什麼,最可讀的代碼是

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

同時,當然你也可以修復括號,寫一樣

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

也就是說,如果有任何Vehicle在您的列表中,不是Car。如果那不可能發生,那爲什麼不是List<Car>呢?

+0

如果車輛列表包含Plane? – gabba 2013-02-18 14:40:52

+1

@gabba:我認爲答案已經涵蓋了這個問題? – Jon 2013-02-18 14:41:25

+0

OfType ()在這種情況下將安全 PS:我會一直更新之前評論8) – gabba 2013-02-18 14:43:50

1

您必須將c轉換爲Car而不是c.ModelName

嘗試:

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

但是,如果你有一個卡車在vehicleList :(雖然 – 2013-02-18 14:39:07

+0

+1,當然這會,但會失敗,Jon和丹尼爾Hilgarth提供更多的細節。感謝upvoting雖然:)請注意,使用'OfType '不會失敗,但會改變語句的含義,因爲它不會通過每輛車來處理,爲了確保正確的行爲,這肯定應該是'List '。 – 2013-02-18 14:48:34

0

嘗試使用:

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

注: 這將返回從你的列表只汽車

4

你必須決定你想擁有什麼:

Car實例或清單列表Vehicle實例。

如果你想有Vehicle情況下,你無法通過的Car性順序表,因爲在Vehicles名單可能還會有一個BusBicycle
做你目前嘗試(鑄造到Car)可能會在運行時拋出一個異常。

說了這麼多,如果你堅持這樣做,你必須要知道的兩件事情:

  1. 你需要修正你的施法:vehicleList.OrderBy(c => ((Car)c).ModelName)
  2. 你需要知道OrderBy沒有按不執行就地排序。 vehicleList仍將按其原始順序排列。如果你想在vehicleList有序的結果,你需要的OrderBy結果分配給它:

    vehicleList = vehicleList.OrderBy(c => ((Car)c).ModelName).ToList(); 
    
+0

如果我的列表只包含汽車廣告,演員陣容不會失敗? – user2025418 2013-02-18 14:42:02

+0

@ user2025418:請參閱更新。 – 2013-02-18 14:42:59

+0

謝謝我在您的更新中尋找這一個。 – user2025418 2013-02-18 17:50:22

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 ""; 
} 

但如果有「非汽車」有位置將由相對於列表中的其他項目空字符串來確定。

+0

這看起來很有趣!那我可以寫下面的東西嗎? vehicleList.OrderBy(C => { 車車= C爲轎車; 如果(車= NULL) 回報car.ModelName;! 否則,如果(c是平面) 回報plane.planeNumber; } – user2025418 2013-02-18 17:37:42

+0

它給錯誤:無法根據用法推斷方法'System.Linq.Enumerable.OrderBy (System.Collections.Generic.IEnumerable ,System.Func )'的類型參數。嘗試指定類型參數明確 – user2025418 2013-02-19 06:40:23

+0

參見上面的編輯 – 2013-02-19 08:44:10

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

這與編寫'.OfType ()'相同,只是更健談。 – Jon 2013-02-18 14:41:55

+0

從來不知道,謝謝。 – Romoku 2013-02-18 14:42:23

相關問題