我有一个看起来像这样的枚举:Bitmask'ed诠释至ENUM []或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};
感谢。
我有一个看起来像这样的枚举:Bitmask'ed诠释至ENUM []或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);
注:enum
值从int
(默认设置)获得这只作品。它也不是完全类型安全的,因为T
不能仅限于enum
的值(尽管如此,没有关系)
以及如何斯普利特的组合值到一个数组? – 2011-03-29 16:43:36
@Henk - 这不,但是,使用这些可避免的原因,希望拆分合并值。 – Oded 2011-03-29 18:02:47
[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();;
}
喜欢的话贾里德而言,我惊讶心不是一个内置的操作,解决了这个开箱。 – maxp 2011-03-29 16:16:35
为什么我们不能添加'where T:Enum'? – 2011-03-29 16:28:01
@Vash C#不允许通用参数被约束为'enum'值。 – JaredPar 2011-03-29 16:35:20