如果我有一个包含标志枚举的变量,我可以以某种方式迭代该特定变量中的单位值吗?或者,我是否必须使用Enum.GetValues遍历整个枚举并检查设置了哪些枚举?
发布于 2014-03-06 18:52:16
几年后,随着经验的增加,我对单个位值的最终答案是从最低位移动到最高位,这是Jeff Mercado内部例程的一个轻微变体:
public static IEnumerable<Enum> GetUniqueFlags(this Enum flags)
{
ulong flag = 1;
foreach (var value in Enum.GetValues(flags.GetType()).Cast<Enum>())
{
ulong bits = Convert.ToUInt64(value);
while (flag < bits)
{
flag <<= 1;
}
if (flag == bits && flags.HasFlag(value))
{
yield return value;
}
}
}
它似乎是有效的,尽管我在几年前就反对过,但我在这里使用HasFlag,因为它比使用逐位比较容易理解得多,并且速度差异对于我将要做的任何事情都是微不足道的。(从那时起,他们完全有可能提高了HasFlags的速度,就我所知……我还没有测试过。)
发布于 2010-11-13 14:26:12
static IEnumerable<Enum> GetFlags(Enum input)
{
foreach (Enum value in Enum.GetValues(input.GetType()))
if (input.HasFlag(value))
yield return value;
}
发布于 2013-12-06 03:33:03
以下是Linq对该问题的解决方案。
public static IEnumerable<Enum> GetFlags(this Enum e)
{
return Enum.GetValues(e.GetType()).Cast<Enum>().Where(e.HasFlag);
}
https://stackoverflow.com/questions/4171140
复制相似问题