0

我创建了以下代码,以更简化地显示我的问题。

我没有通过编译器运行这个版本,所以它可能有错别字。

我正在寻找是否有更简洁的方式(甚至更好的方式)来搜索包含继承类的列表。

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();

我想要的是对' Ford("Mustang") > Engine > FuelType > "Petrol" '的引用。(假设集合将只包含一个)

//-- 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 --

尽管这是可行的,但可以将上述两个语句合并为一个。

类结构只是一个简单的例子,设计与我的真实代码并不完全相关。

4

4 回答 4

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");
于 2013-09-19T00:37:06.753 回答
1

好的,我认为这只是一个模拟示例,而不是您的真实模型。在这种情况下,您可能会将引擎移至底座...因此,假设这只是问题的一个示例,您可以做的是...

var fords = carsCollection.OfType<Ford>().ToList();
foreach(var f in fords)
{
  //something with f.Engine
}
于 2013-09-19T00:42:29.063 回答
1
var ford = carCollection.FindAll(cc => cc.Make == "Ford")
            .Cast<Ford>().FirstOrDefault(x => x.Engine.FuelType == "Petrol");
于 2013-09-19T01:00:28.247 回答
0

它可能不漂亮,但也许这样的事情会起作用: Ford ford = ((List<Ford>)(carCollection.FindAll( cc => cc.Make == "Ford" ))).Find( fc => fc.Engine.FuelType == "Petrol" )

于 2013-09-19T00:43:04.217 回答