搜索包含继承类</t>的c#List <t>

时间:2013-09-19 00:34:20

标签: c# .net linq generics

我创建了以下代码,只是一种更简单的方式来显示我的问题。

我没有通过编译器运行此版本,因此它可能有拼写错误。

我正在寻找一种更加浓缩的方式(甚至更好的方法)来搜索包含继承类的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 --

虽然这样可行,但可以将上述两个语句合并为一个。

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

4 个答案:

答案 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" )