単一の LINQ 式で次のことを実行できますか? アイテムのリストがあります:
public enum ItemType
{
Top,
Bottom,
Side,
CornerBottom,
CornerTop
}
public class Item
{
public int ID;
public ItemType Type;
}
ItemType に基づいてアイテムを選択したいのですが、CornerBottom と CornerTop には特殊なケースがあります。CornerBottom アイテムを検索していて、そのような結果がない場合は、代わりに Bottom アイテムが必要です。そこまで実績があるならサイドアイテムが欲しい。コーナートップと同様に、コーナートップのアイテムを最初に、次にトップを、次にサイドを 3 番目に好みます。
これは単一の式で実行できますか? 現在、各 ItemType を処理する switch ステートメントがあります。しかし、実際には私の Item クラスはより複雑であり (さらに ItemType が多くあり)、このコア機能を必要とするさまざまなクエリが多数あるため、これは扱いにくいものです。
編集:さて、私の最終的な解決策はこれです。スペンサーが推奨するように、好みの検索順序で ItemType 列挙型を並べ替えました。次に、カスタム比較コードを別の関数 (再利用しやすい) に配置し、orderby して最初の値を返します。
ItemType searchType = ItemType.CornerTop;
var i = (from item in Items
where typeCheck(item, searchType)
orderby item.Type descending).FirstOrDefault();
bool typeCheck(Item item, ItemType type)
{
switch (type)
{
case ItemType.CornerTop:
return (item.Type == ItemType.CornerTop)
|| (item.Type == ItemType.Top)
|| (item.Type == ItemType.Side);
case ItemType.CornerBottom:
return (item.Type == ItemType.CornerBottom)
|| (item.Type == ItemType.Bottom)
|| (item.Type == ItemType.Side);
default:
return item.Type == type;
}
}