搜索包含继承类的 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 --

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

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

搜索包含继承类的 c# 列表<T>

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