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" ' への参照です。(コレクションには 1 つしか含まれないと仮定します)

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

これは機能しますが、上記の 2 つのステートメントを 1 つに結合することは可能です。

クラス構造は単純な例にすぎず、設計は実際のコードとは完全に関連していません。

4

4 に答える 4

1
var ford = carCollection.FindAll(cc => cc.Make == "Ford")
            .Cast<Ford>().FirstOrDefault(x => x.Engine.FuelType == "Petrol");
于 2013-09-19T01:00:28.247 に答える
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 に答える