我创建了以下代码,只是一种更简单的方式来显示我的问题。
我没有通过编译器运行此版本,因此它可能有拼写错误。
我正在寻找一种更加浓缩的方式(甚至更好的方法)来搜索包含继承类的List。
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();
我想要的是对'福特(“Mustang”)&gt;的引用。引擎&gt; FuelType&gt; “汽油”'。 (假设集合只包含一个)
//-- Start --
List<Ford> fordCollection = carCollection.FindAll( cc => cc.Model == "Mustang" )
.Cast<Ford>().ToList();
我无法访问上面的fuelType,所以我在下面的单独声明中这样做。
// This 'ford' is the reference I require
Ford ford = fordCollection.Find( fc => fc.Engine.FuelType == "Petrol" );
//-- Finish --
虽然这样可行,但可以将上述两个语句合并为一个。
类结构只是一个简单的例子,设计与我的实际代码完全无关。
答案 0 :(得分:1)
难道并非所有汽车都有发动机吗?
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");
答案 1 :(得分:1)
好吧,我认为这只是一个模拟的例子而不是你的真实模型。在这种情况下,您可能会将引擎移动到基础...所以,假设这只是问题的一个例子,您可以做的是......
var fords = carsCollection.OfType<Ford>().ToList();
foreach(var f in fords)
{
//something with f.Engine
}
答案 2 :(得分:1)
var ford = carCollection.FindAll(cc => cc.Make == "Ford")
.Cast<Ford>().FirstOrDefault(x => x.Engine.FuelType == "Petrol");
答案 3 :(得分:0)
它可能不漂亮,但也许这样的东西可行:
Ford ford = ((List<Ford>)(carCollection.FindAll( cc => cc.Make == "Ford" ))).Find( fc => fc.Engine.FuelType == "Petrol" )