0

単一の 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;
    }
}
4

2 に答える 2

2

各列挙値に、優先順位に従って数値を指定します。アイテムのリストをタイプで並べ替え、最初のものを取得します。

于 2012-11-27T01:47:09.517 に答える
1

2 つのバランスの取れたツリーを構築できます。CornerTop -> Top -> Side の順序で並べられた最初のツリー。2 つ目は、CornerBottom -> Bottom -> Side です。CornerTop または CornerBottom を検索すると、ツリーの最初のアイテム item を取得できます。他のタイプを検索する場合は、log(N) で直接検索できます。LINQ では、コレクションを並べ替えて最初のものを取得するか、バイナリ検索アルゴリズムで検索できます。

于 2012-11-27T01:59:35.930 に答える