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就没有必要了.
脚步:
enum值并将结果转换为类型enumenum值整数值对值进行排序(否则它们按无符号幅度自然排序)码:
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
首先,如果可能的话,我会使你的枚举值为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)
“ ...只显示前四个状态,而忽略其余四个。”
要获取的第一个n元素IEnumerable<T>,请使用Take方法:
return Enum.GetValues(typeof(Activity.StatusEnum))
.Cast<Activity.StatusEnum>()
.Take(4)
.ToList();
Run Code Online (Sandbox Code Playgroud)