簡體   English   中英

如何在Enum上執行LINQ查詢?

[英]How to perform LINQ query over Enum?

以下是我的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個狀態。

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));

好吧,如果你要硬編碼應該在列表中的項目,為什么不這樣做:

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就沒有必要了。

腳步:

  • 獲取enum值並將結果轉換為enum的類型
  • 按整數值對enum值進行排序(否則它們按無符號大小自然排序)
  • 拿第4個

碼:

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

輸出:

Open Rejected Accepted Started

首先,如果可能的話,我會使你的枚舉值為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();
}

編輯 :鑒於您無法更改枚舉值,我建議您使用以下內容:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM