如何在Enum上执行LINQ查询

本文关键字:执行 LINQ 查询 Enum | 更新日期: 2023-09-27 18:18:20

下面是我的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个数的状态

如何在Enum上执行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));

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

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);
输出:

打开拒绝接受开始

首先,如果可能的话,我会让你的枚举值为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)