以下は私の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個のステータスを取得するだけではない汎用的なソリューションが必要です。
とにかくリストにあるべきアイテムをハードコーディングするつもりなら、なぜこれをしないのですか?
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は必要ありません。
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));
手順:
enum
値を取得し、結果をenum
の型にキャストしますenum
値を整数値でソートします(そうでなければ、符号なしの大きさで自然にソートします)コード:
return Enum.GetValues(typeof(Activity.StatusEnum))
.Cast<Activity.StatusEnum>()
.OrderBy(se =>(int)se)
.Take(4);
出力:
拒否された承認済みを開く
最初に、可能であれば、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
};
}
「。。。最初の4つのステータスのみを表示し、残りは無視します。」
IEnumerable<T>
の最初のn
要素を取得するには、Take
メソッドを使用します。
return Enum.GetValues(typeof(Activity.StatusEnum))
.Cast<Activity.StatusEnum>()
.Take(4)
.ToList();
以下のラインに沿ったものはどうですか?
.Where(x => x <= Activity.StatusEnum.Started)