如何在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个数的状态
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)