c#按基类中的字段搜索集合

c#按基类中的字段搜索集合,c#,inheritance,observablecollection,C#,Inheritance,Observablecollection,给定的是一个基类和一些派生类: 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 { pub

给定的是一个基类和一些派生类:

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的车辆最有效的方法是什么?

您应该创建
基本车辆的集合
baseVehicle
是其他车辆的基类,您可以添加具有
baseVehicle
类型或派生自
baseVehicle
类型的所有对象),不是
对象的集合
(您可以使用
对象的集合
,但应将元素强制转换为正确的类型):

您可以使用
组合条件:

var vehicle = vehicles.FirstOrDefault(i => i.Id == 43 || i.vName == "some name");
此外,您还可以使用

var vehicle = vehicles.FirstOrDefault(i => i.Id == 43 && i.vName == "some name");
获取多个元素:

使用
Where()


您应该创建
baseVehicle
的集合(
baseVehicle
是其他对象的基类,您可以添加具有
baseVehicle
类型或从
baseVehicle
派生的类型的每个对象),而不是
对象的集合(可以使用
对象的集合
,但应将元素强制转换为正确的类型):

您可以使用
组合条件:

var vehicle = vehicles.FirstOrDefault(i => i.Id == 43 || i.vName == "some name");
此外,您还可以使用

var vehicle = vehicles.FirstOrDefault(i => i.Id == 43 && i.vName == "some name");
获取多个元素:

使用
Where()


按照注释中的建议,使用
ObservableCollection
并对其进行过滤:

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

按照注释中的建议,使用
ObservableCollection
并对其进行过滤:

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

将您的收藏更改为
ObservableCollection
,或者您可以按如下方式将其转换:

vehicles.Cast<baseVehicle>().FirstOrDefault(i => i.Id == 43 || i.vName == "Name...");
vehicles.Cast().FirstOrDefault(i=>i.Id==43 | | i.vName==“Name…”);

将您的收藏更改为
ObservableCollection
,或者您可以按如下方式进行铸造:

vehicles.Cast<baseVehicle>().FirstOrDefault(i => i.Id == 43 || i.vName == "Name...");
vehicles.Cast().FirstOrDefault(i=>i.Id==43 | | i.vName==“Name…”);

使用
observedcollection
而不是
observedcollection
。您可以通过LINQ搜索集合:
车辆。其中(v=>Id=123);
为什么不进行类型
基本车辆的集合
然后使用
车辆。第一个默认值(v=>v.vName==“Alfa Romeo Giulietta”| v.Id==32)
?糟糕,但是集合将包含卡车、敞篷车等。@pb_SKAT,只要集合中存储的对象来自仍然有效的相同基类。请查看多态性。使用
observateCollection
而不是
observateCollection
。您可以通过LINQ:
vehicles.Where来搜索集合(v=>Id=123);
为什么不收集类型
baseVehicle
,然后使用
vehicles.FirstOrDefault(v=>v.vName==“Alfa Romeo Giulietta”| v.Id==32)
?噢,但是集合将包含卡车、敞篷车等…?@pb_SKAT,只要集合中存储的对象来自相同的基类,它仍然可以工作。看看多态性。干杯,工作完美。我来自VB,认为在那里看起来有点不同…但我能像SUV一样处理找到的对象吗@不客气,请大家接受正确且有效的答案。我来自VB,认为那里看起来有点不同……但我能像SUV一样处理找到的对象吗?@pb_SKAT,不客气,请接受正确且有效的答案please@Iwb:谢谢,这是一个很好的选择,可以解决我的c一旦注意到我不仅要找到一辆特定的汽车,还要根据它的派生类来处理它。也就是说,如果找到的汽车是一辆卡车,我需要得到一个类卡车对象。你也可以使用接口。:)。如果您的问题已解决,请接受正确答案。@Iwb:谢谢,铸造集合是个好主意,这可能会解决我的问题,即我不仅要找到特定的车辆,还要根据其派生类来处理它。也就是说,如果找到的车辆是一辆卡车,我需要获得一个类卡车对象。您也可以使用接口。:). 如果你的问题解决了,请接受正确的答案。