如何在Enum上执行LINQ查询?

Lea*_*ner 29 .net c# linq data-binding enums

以下是我的Enumerator List:

public enum StatusEnum
{
    Open = 1,
    Rejected = 2,
    Accepted = 3,
    Started = 4,
    Completed = 5,
    Cancelled = 6,
    Assigned = 7
}
Run Code Online (Sandbox Code Playgroud)

我需要将它绑定到a 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();
}
Run Code Online (Sandbox Code Playgroud)

但是,我觉得代码有点乱,并不是将过滤Enum列表绑定到的正确方法Combobox.任何人都可以建议一个更强大的方法吗?

更新

我可能需要更改选择顺序.所以我需要一个通用的解决方案,它不仅可以获得前X个状态.

It'*_*ie. 39

return Enum.GetValues(typeof(Activity.StatusEnum)).Cast<Activity.StatusEnum>().Where((n, x) => x < 4);
Run Code Online (Sandbox Code Playgroud)

如果您希望能够更改项目列表,只需将它们添加到a 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));
Run Code Online (Sandbox Code Playgroud)


p.s*_*w.g 11

好吧,如果你要硬编码应该在列表中的项目,为什么不这样做:

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

您也可以丢弃List<T>并返回数组本身.只要您知道这些是您想要的项目,那么Linq就没有必要了.


Ste*_*edy 8

脚步:

  • 获取enum值并将结果转换为类型enum
  • enum值整数值对值进行排序(否则它们按无符号幅度自然排序)
  • 拿第4个

码:

return Enum.GetValues(typeof(Activity.StatusEnum))
.Cast<Activity.StatusEnum>()
.OrderBy(se =>(int)se)
.Take(4);
Run Code Online (Sandbox Code Playgroud)

输出:

Open Rejected Accepted Started


Chr*_*ett 7

首先,如果可能的话,我会使你的枚举值为2的幂,所以它们可以一起进行OR运算.

public enum StatusEnum
{
    Open = 1,
    Rejected = 2,
    Accepted = 4,
    Started = 8,
    Completed = 16,
    Cancelled = 32,
    Assigned = 64
}
Run Code Online (Sandbox Code Playgroud)

然后你可以做这样的事情:

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();
}
Run Code Online (Sandbox Code Playgroud)

编辑:鉴于您无法更改枚举值,我建议您使用以下内容:

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


Tim*_*lds 5

“ ...只显示前四个状态,而忽略其余四个。”

要获取的第一个n元素IEnumerable<T>,请使用Take方法:

return Enum.GetValues(typeof(Activity.StatusEnum))
    .Cast<Activity.StatusEnum>()
    .Take(4)
    .ToList();
Run Code Online (Sandbox Code Playgroud)