簡體   English   中英

Bitmask'ed Int到Enum []或Int []? C#

[英]Bitmask'ed Int to Enum[] or Int[]? c#

我有一個看起來像這樣的枚舉:

enum foo{
a=0,
b=1,
c=2,
d=4
}

構建標志/位掩碼很好,但可以做類似的事情

int i = 3;
var bar =  Enum.Split(foo,i);

導致像

bar = foo[]{a, b,c};

謝謝。

請嘗試以下方法

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派生的enum值(默認設置)。 它也不是完全類型安全的,因為T不能僅限於enum值(盡管如此)無關緊要

您可以在枚舉上使用FlagsAttribute並免費獲得許多功能(無需在位級別工作)。

MSDN將該屬性描述為:

表示可以將枚舉視為位字段; 也就是說,一組標志。

[FlagsAttribute]允許您提取所有有效值。

http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx

嘗試這個:

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();
}

像這樣稱呼它:

var bar = EnumSplit<foo>(i);

最好,您希望將其更改為返回IEnumerable<TEnum>而不是TEnum[]

您可以使用從您傳遞的Enum提取值的方法來執行此操作:

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();;
}
    var flags = Enum.GetValues(typeof (/* YourEnumType */))
                  .Cast</* YourEnumType */>()
                  .Select(v => enumValue.HasFlag(v))
                  .ToArray();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM