搜索包含继承类的 c# 列表
本文关键字:列表 包含 继承 搜索 | 更新日期: 2023-09-27 18:31:48
我创建了以下代码,只是为了以更简单的方式显示我的问题。
我没有通过编译器运行这个版本,所以它可能有错别字。
我正在寻找是否有更简洁的方法(甚至更好的方法)来搜索包含继承类的列表。
public class Engine {
public String FuelType { get; set; }
}
----------------------------------------------------------------------------
public class Wheel {
public String TyreType { get; set; }
}
----------------------------------------------------------------------------
public abstract class Car {
public abstract String Model { get; }
}
public class Ford : Car {
public override String Model {
get { return "Mustang"; } // Hardcoded for brevity
}
Public Engine Engine { get; set; }
}
public class Porche : Car {
public override String Model {
get { return "911"; } // Hardcoded for brevity
}
Public Wheel Wheel { get; set; }
}
----------------------------------------------------------------------------
// CarCollection as follows:
// Ford("mustang") > Engine > FuelType > "Petrol"
// Ford("mustang") > Engine > FuelType > "Diesel"
// Porche("911") > Wheel > TyreType > "Dry"
List<Car> carCollection = GetCarcollection();
我想要的是参考" 福特("野马")>发动机>燃料类型>"汽油"。(假设集合只包含一个)
//-- Start --
List<Ford> fordCollection = carCollection.FindAll( cc => cc.Model == "Mustang" )
.Cast<Ford>().ToList();
我无法访问上面的燃料类型,所以我在下面的单独声明中这样做。
// This 'ford' is the reference I require
Ford ford = fordCollection.Find( fc => fc.Engine.FuelType == "Petrol" );
//-- Finish --
虽然这有效,但可以将上述两个语句合并为一个。
类结构只是一个简单的示例,设计与我的实际代码并不完全相关。
var ford = carCollection.FindAll(cc => cc.Make == "Ford")
.Cast<Ford>().FirstOrDefault(x => x.Engine.FuelType == "Petrol");
好的,我假设这只是一个模拟示例,而不是您的真实模型。在这种情况下,您可能会将发动机移动到底座...因此,假设这只是问题的一个例子,您可以做的是......
var fords = carsCollection.OfType<Ford>().ToList();
foreach(var f in fords)
{
//something with f.Engine
}
不是所有的汽车都有引擎吗?
public abstract class Car {
public abstract String Make { get; }
public Engine Engine { get; set; }
}
或者,您可以使用carCollection.OfType<Ford>()
也许是这样的:
var ford = (from c in carCollection.OfType<Ford>()
where c.Model == "Mustang"
&& c.Engine.FuelType == "Petrol"
select c).FirstOrDefault();
或
var ford = carCollection.OfType<Ford>()
.FirstOrDefault(c => c.Model == "Mustang"
&& c.Engine.FuleType == "Petrol");
它可能不漂亮,但也许这样的东西会起作用: Ford ford = ((List<Ford>)(carCollection.FindAll( cc => cc.Make == "Ford" ))).Find( fc => fc.Engine.FuelType == "Petrol" )