私はシンプルなインターフェース、IDeviceを持っています
public interface IDevice{
string Id{ get; }
}
IDevice
を実装するオブジェクトのリストがあります
List<IDevice> devices;
このリストの2つのタイプのオブジェクトの例は次のとおりです。
public class BatteryDevice : IDevice{
public string Id{ get; private set; }
public int StateOfCharge{ get; set; }
}
public class GridDevice : IDevice{
public string Id{ get; private set; }
public decimal Voltage{ get; set; }
}
ユーザーが次のようなSQLクエリを使用してテキストで条件を設定できるようにしたいのですが。
Id = 'Battery1' AND StateOfCharge > 95
テキスト構成ファイルからこれらの条件を読み取り、次のような動的LINQを使用してデバイスのリストに対して評価できるように:
var matches = devices.Where("Id = 'Battery1' AND StateOfCharge > 95");
これは機能しません。なぜなら、(もちろん) StateOfCharge
からStateOfCharge
値を取得しようとするとLINQが失敗するためGridDevice
私は少しn00bのように感じて、私の目標を達成する方法を探しています。
あなたは書ける:
var matches = devices
.OfType<BatteryDevice>()
.Where(device => device.Id == "Battery1" && device.StateOfCharge > 95)
.ToList();
それから、すべてのデバイスを選択List
のIDevice
型のBatteryDevice
マッチング所望の条件と戻り有するList<BatteryDevice>
得LINQクエリ配列の項目を有します。
結果をどう処理するかによって、 ToList
を使用しても使用しなくてもToList
ません。
そうでない場合、結果はIEnumerable<BatteryDevice>
タイプです。
IDevice
List
をIDevice
するには、 IDevice
を使用できます。
.ToList<IDevice>();
または、次のように書くことができます。
var matches = (IEnumerable<IDevice>)devices...
Linqなし
var matches = new List<IDevice>();
foreach ( var device in devices )
if ( device is BatteryDevice )
{
var battery = (BatteryDevice)device;
if ( battery.Id == "Battery1" && battery.StateOfCharge > 95 )
matches.Add(battery);
}