Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否将位掩码整型设置为枚举[]或整型[]?C_C#_Bitmask - Fatal编程技术网

C# 是否将位掩码整型设置为枚举[]或整型[]?C

C# 是否将位掩码整型设置为枚举[]或整型[]?C,c#,bitmask,C#,Bitmask,我有一个如下所示的枚举: enum foo{ a=0, b=1, c=2, d=4 } var bar = EnumSplit<foo>(i); 构建标志/位掩码很好,但是否可以执行以下操作 int i = 3; var bar = Enum.Split(foo,i); bar = foo[]{a, b,c}; 导致类似于 int i = 3; var bar = Enum.Split(foo,i); bar = foo[]{a, b,c}; 谢谢。您可以在枚举上使用

我有一个如下所示的枚举:

enum foo{
a=0,
b=1,
c=2,
d=4
}
var bar = EnumSplit<foo>(i);
构建标志/位掩码很好,但是否可以执行以下操作

int i = 3;
var bar =  Enum.Split(foo,i);
bar = foo[]{a, b,c};
导致类似于

int i = 3;
var bar =  Enum.Split(foo,i);
bar = foo[]{a, b,c};
谢谢。

您可以在枚举上使用,免费获得许多功能,无需在位级别工作

MSDN将该属性描述为:

指示可以将枚举视为位字段;也就是说,一组标志

试试下面的方法

public static IEnumerable<T> Split<T>(int value) {
  foreach (object cur in Enum.GetValues(typeof(T))) {
    var number = (int)(object)(T)cur;
    if (0 != (number & value)) {
      yield return (T)cur;
    }
  }
}
用这个你现在可以写了

int i = 3;
IEnumerable<foo> e = Split<foo>(i);
注意:这仅适用于从默认设置int派生的枚举值。它也不是完全类型安全的,因为T不能被限制为仅枚举值,尽管[FlagsAttribute]允许您提取所有有效值,但对此无需做任何事情

试试这个:

TEnum[] EnumSplit<TEnum>(int mask)
{
    List<TEnum> values = new List<TEnum>();
    foreach(int enumValue in Enum.GetValues(typeof(TEnum)))
    {
        if(mask & enumValue == enumValue)
            values.Add((TEnum)enumValue);
    }
    return values.ToArray();
}
可以这样称呼:

enum foo{
a=0,
b=1,
c=2,
d=4
}
var bar = EnumSplit<foo>(i);

最好是将其更改为返回IEnumerable而不是TEnum[]。可以使用从传递的枚举中提取值的方法执行此操作:

public static T[] EnumSplit<T>(int value) where T : struct
{
    // Simplified as Enum.GetValues will complain if T is not an enum
    // However, you should add a check to make sure T implements FlagAttribute
    return (from vv in Enum.GetValues(typeof(T))
            where ((int)vv & value) != 0
            select (T)vv).ToArray();;
}

就像Jared一样,我很惊讶没有一个内置的操作符可以解决这个问题。为什么我们不能添加where T:Enum?@Vash C不允许将泛型参数约束为Enum值。@JaredPar,true,但我们使用的是一个没有值的类,所以这应该是可能的,但在这个示例中,对我来说是有问题的。这会导致编译错误吗?@Vash添加了缺少的对象强制转换。我不相信will会编译,因为C无法知道t实现了HasFlag。这是如何将组合值拆分为数组的?@Henk-但是,使用它们可能会避免拆分组合值的原因。