如何在Enum上执行LINQ查询?

时间:2013-06-13 16:09:22

标签: c# .net linq data-binding enums

以下是我的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个状态。

6 个答案:

答案 0 :(得分:36)

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

答案 1 :(得分:11)

如果您要对列表中应该包含的项进行硬编码,为什么不这样做呢:

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

答案 2 :(得分:7)

<强>步骤:

  • 获取enum值并将结果转换为enum
  • 的类型
  • enum值按其整数值排序(否则排序 自然地通过无符号量级)
  • 采取前4

<强>代码:

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

<强>输出:

  

Open Rejected Accepted Started

答案 3 :(得分:6)

首先,如果可能的话,我会将你的枚举值设为2,所以它们可以一起进行“或”运算。

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 :(得分:5)

  

&#34 ;. 。 。只显示前4个状态而忽略其余部分。&#34;

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

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

答案 5 :(得分:3)

如何处理以下内容:

.Where(x => x <= Activity.StatusEnum.Started)