帮助构建基于枚举的列表

本文关键字:枚举 列表 构建 于枚举 帮助 | 更新日期: 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 );
      }