2017-02-14 44 views
0

是一個基類和一些派生類:C#搜索通過實地收集在給定基類

class baseVehicle 
{ 
    public int Id { get; set; } 
    public string vName { get; set; } 
    public int maxSpeed { get; set; } 
} 
class truck : baseVehicle 
{ 
    public int loadTons { get; set; } 
} 
class cabrio : baseVehicle 
{ 
    public bool softTop { get; set; } 
} 
class suv : baseVehicle 
{ 
    public int NoOfSeats { get; set; } 
} 

,所有這些車輛對象被創建並插入一個集合:

public ObservableCollection<object> vehicles = new ObservableCollection<object>vehicles(); 

是什麼使用vName =「Alfa Romeo Giulietta」或Id = 43找到車輛的最有效方法?

+3

使用'的ObservableCollection '而不是'ObservableCollection '。您可以通過LINQ搜索集合:'vehicles.Where(v => Id = 123);' –

+3

爲什麼不製作'baseVehicle'類型的集合,然後使用'vehicles.FirstOrDefault(v => v.vName ==「阿爾法羅密歐Giulietta「|| v.Id == 32);'? –

+0

OOPS,但收集將包含卡車,cabrios等......? –

回答

1

您的收藏更改爲ObservableCollection<baseVehicle>或者你可以施放它是這樣的:

vehicles.Cast<baseVehicle>().FirstOrDefault(i => i.Id == 43 || i.vName == "Name..."); 
+0

@IWB:謝謝,好主意來收集,這可能解決我的擔憂,我不僅要找到一輛特定的車輛,但隨後基於它的派生類。即如果找到的車輛是卡車,我需要獲得班級卡車對象。 –

+0

您也可以使用Interfaces。 :)。 如果問題解決了,請接受正確答案。 – lwb

1

您應該創建的baseVehicle集合(baseVehicle是對別人的基類,你可以添加具有不同於baseVehicle衍生的baseVehicle或類型類型中的每個對象),而不是object集合(可以使用的object集合,但你應該投元素,以正確的類型):

public ObservableCollection<baseVehicle> vehicles = new ObservableCollection<baseVehicle>vehicles(); 

得到一元:

可以使用FirstOrDefault() - 您可以使用First()但你應該確保該元素存在於集合(與拉姆達條件):

var vehicle = vehicles.FirstOrDefault(i => i.Id == 43); 
if (vehicle != null) 
{ 
    //some code 
} 

可以使用OR結合條件:

var vehicle = vehicles.FirstOrDefault(i => i.Id == 43 || i.vName == "some name"); 

此外,您還可以使用AND

var vehicle = vehicles.FirstOrDefault(i => i.Id == 43 && i.vName == "some name"); 

獲取幾個元素:

使用Where();

var someVehicles = vehicles.Where(i => i.Contains("Alfa")); 
//or 
var someVehicles = vehicles.Where(i => i.Id == 2 || i.vName == "Some name); 
+0

歡呼聲,作品完美。我來自VB認爲看起來有點不同...但是我能否處理找到的對象,例如:一輛SUV? –

+0

@pb_SKAT,歡迎您,接受正確和有效的答案,請 –

1

正如評論所說,它使用ObservableCollection<baseVehicle>和過濾:

collection.where(x=>x.Id == 43 || x.vName == "Alfa Romeo Giulietta").FirstOrDefault();