帮助构建基于枚举的列表
本文关键字:枚举 列表 构建 于枚举 帮助 | 更新日期: 2023-09-27 18:09:25
我有一个枚举:
public enum SomeEnum
{
A = 2,
B = 4,
C = 8
D = 16
}
SomeEnum e1 = SomeEnum.A | SomeEnum.B
现在我想要一个枚举值列表,所以e1应该是:
2, 4
所以我有:
List<int> list = new List<int>();
foreach(SomeEnum se in Enum.GetValues(typeof(SomeEnum)))
{
if(.....)
{
list.Add( (int)se );
}
}
我需要上面if语句的帮助。
更新
如何构建表示枚举e1
中设置的标志的int列表?
我怀疑你想要:
if ((e1 & se) != 0)
另一方面,使用无限制旋律,你可以写:
foreach (SomeEnum se in Enums.GetValues<SomeEnum>())
{
if (se.HasAny(e1))
{
list.Add((int) se);
}
}
或者使用LINQ:
List<int> list = Enums.GetValues<SomeEnum>()
.Where(se => se.HasAny(e1))
.Select(se => (int) se)
.ToList();
(如果您可以使用e1.GetFlags()
或其他东西依次迭代每个位,那就太好了……我们会在另一个版本中考虑这一点。(
如果值在e1中,是否要添加该值?
然后您可以在.NET4中使用HasFlag方法。
if(e1.HasFlag(se))
{
list.Add( (int)se );
}
如果您不使用.net,则等效为e1 & se == se
此外,根据惯例,您应该使用FlagsAttribute标记您的枚举,并且它应该是复数形式(SomeEnums(
if((int)(e1 & se) > 0)
这应该可以做到
这将适用于
if((int)se==(int)SomeEnum.A||(int)se==(int)SomeEnum.B )
{
list.Add( (int)se );
}