1

ユーザーが選択したものに基づいて、比較するときに異なるタイプの列挙値を選択しようとしています。

これは私のコードです:

    public enum CategoryType { E1, E2, E3, E4 }

    List1.Add(new model{ Line = "Line 1", Category = model.CategoryType.E3| model.CategoryType.E1});
    List1.Add(new model{ Line = "Line 2", Category = model.CategoryType.E2 | model.CategoryType.E1});
    List1.Add(new model{ Line = "Line 3", Category = model.CategoryType.E4  | model.CategoryType.E3});

var   modelEnum = CategoryType.E1 | CategoryType.E3

var ValidLines = List1.Where(P => P.Category == modeEnum ).ToList()
                      .Select(P => P.Line).ToList();

上記のコードは機能しません。E1 または E3 を探しているので、E1 または E3 を含むすべてのアイテムを返す必要があります。この場合、すべてのアイテムに E1 または E3 が含まれているため、上記の 3 つのアイテムをすべて返す必要があります。

私は何を間違っていますか?

ありがとう

4

1 に答える 1

0

あなたは少し混乱しているようです。あなたが望むのは、列挙型で Flags 属性を使用してから、それらに一意の値を割り当てることだと思います (コードが無効なため難しいです)。例えば:

[Flags]
public enum CategoryType { E1 = 1, E2 = 2, E3 = 4, E4 = 8 }

このように、「ビットまたは」演算子 (|) を使用すると、値 (最大 31 個の値に 0 を加えたもの) を適切に組み合わせて一意の値にすることができます。それをテストするには、次のようにします。

if ((value & CategoryType.E2) == CategoryType.E2) { ...

彼らはあなたがそれを持っている方法で、あなたのビットまたはのが非一意のintを返します。あなたが持っているのはこれです:

public enum CategoryType { E1 = 0, E2 = 1, E3 = 2, E4 = 3 }

これはデフォルトの列挙動作です。だからE1 | E3 は 0 | 2 は 2 です。E2 | E3 は 1 | 2 は 3 で、E4 と同じです。

于 2013-10-20T03:41:50.737 に答える