web-dev-qa-db-ja.com

EnumでLINQクエリを実行する方法は?

以下は私のEnumerator List

public enum StatusEnum
{
    Open = 1,
    Rejected = 2,
    Accepted = 3,
    Started = 4,
    Completed = 5,
    Cancelled = 6,
    Assigned = 7
}

これをComboboxにバインドする必要がありますが、いくつかの特定のステータスのみを表示し、残りは無視します。

これは私がこれまで持っているものです:

public static List<Activity.StatusEnum> StatusList()
{
        IEnumerable<Activity.StatusEnum> query = Enum.GetValues(typeof(Activity.StatusEnum)).Cast<Activity.StatusEnum>()
                        .Where(x => x == Activity.StatusEnum.Open
                            || x == Activity.StatusEnum.Rejected
                            || x == Activity.StatusEnum.Accepted
                            || x == Activity.StatusEnum.Started);
        return query.ToList();
}

ただし、コードは少し乱雑で、フィルター処理されたEnumリストをComboboxにバインドする正しいアプローチではないと感じています。誰もこれを行うためのより堅牢な方法を提案できますか?

更新

選択順序を変更する必要がある場合があります。したがって、最初のX個のステータスを取得するだけではない汎用的なソリューションが必要です。

28
Learner

とにかくリストにあるべきアイテムをハードコーディングするつもりなら、なぜこれをしないのですか?

public static List<Activity.StatusEnum> StatusList()
{
    return new List<Activity.StatusEnum>
    { 
        Activity.StatusEnum.Open, 
        Activity.StatusEnum.Rejected, 
        Activity.StatusEnum.Accepted, 
        Activity.StatusEnum.Started 
    };
}

List<T>を破棄して、配列自体を返すこともできます。これらが必要なアイテムであることがわかっている限り、Linqは必要ありません。

11
p.s.w.g
return Enum.GetValues(typeof(Activity.StatusEnum)).Cast<Activity.StatusEnum>().Where((n, x) => x < 4);

アイテムのリストを変更できるようにするには、それらをList<Activity.StatusEnum>およびContainsを使用します。

var listValid = new List<Activity.StatusEnum>() { Activity.StatusEnum.Open, Activity.StatusEnum.Rejected, Activity.StatusEnum.Accepted, Activity.StatusEnum.Started };
return Enum.GetValues(typeof(Activity.StatusEnum)).Cast<Activity.StatusEnum>().Where(n => listValid.Contains(n));
38
It'sNotALie.

手順:

  • enum値を取得し、結果をenumの型にキャストします
  • enum値を整数値でソートします(そうでなければ、符号なしの大きさで自然にソートします)
  • 最初の4つを取る

コード:

return Enum.GetValues(typeof(Activity.StatusEnum))
.Cast<Activity.StatusEnum>()
.OrderBy(se =>(int)se)
.Take(4);

出力:

拒否された承認済みを開く

7
Stephen Kennedy

最初に、可能であれば、enum値を2の累乗にするため、それらをORで結合できます。

public enum StatusEnum
{
    Open = 1,
    Rejected = 2,
    Accepted = 4,
    Started = 8,
    Completed = 16,
    Cancelled = 32,
    Assigned = 64
}

次に、このようなことをすることができます:

public static List<Activity.StatusEnum> StatusList()
{
    var statusesToShow = Activity.StatusEnum.Open | Activity.StatusEnum.Rejected | Activity.StatusEnum.Accepted | Activity.StatusEnum.Started;

    return Enum
        .GetValues(typeof(Activity.StatusEnum))
        .Cast<Activity.StatusEnum>()
        .Where(x => (x & statusesToShow) == x)
        .ToList();
}

[〜#〜] edit [〜#〜]:列挙値を変更できないという事実に照らして、次のようなものを使用することをお勧めします。

public static List<Activity.StatusEnum> StatusList()
{
    return new List<Activity.StatusEnum> {
        Activity.StatusEnum.Open, 
        Activity.StatusEnum.Rejected, 
        Activity.StatusEnum.Accepted, 
        Activity.StatusEnum.Started
    };
}
6
Chris Doggett

「。。。最初の4つのステータスのみを表示し、残りは無視します。」

IEnumerable<T>の最初のn要素を取得するには、Takeメソッドを使用します。

return Enum.GetValues(typeof(Activity.StatusEnum))
    .Cast<Activity.StatusEnum>()
    .Take(4)
    .ToList();
5
Timothy Shields

以下のラインに沿ったものはどうですか?

.Where(x => x <= Activity.StatusEnum.Started)
3
John Bustos