gpt4 book ai didi

c# - 位掩码枚举的通用单标志枚举

转载 作者:太空宇宙 更新时间:2023-11-03 22:28:52 25 4
gpt4 key购买 nike

我正在开发一个代码库,其中包含几个看起来像这样的位标志枚举

public enum BitMask
{
None = 0,

OptionA = 1 << 0,
OptionB = 1 << 1,

OptionAandB = OptionA | OptionB,

All = ~0
}

我可以使用这个遍历所有枚举值

public IEnumerable<T> EnumValues<T>()
{
return Enum.GetValues(typeof(T)).Cast<T>();
}

我正在寻找一种仅遍历单个标志值的通用方法,在本例中为 OptionAOptionB OptionAandB全部。我可以转换为 long 并检测单个标志,因为它们是两个的幂,在这里快速搜索表明这一点

public bool IsPowerOfTwo(long val)
{
return (val != 0) && ((val & (val-1)) == 0) ;
}

非通用版本工作正常

public IEnumerable<BitMask> SingleFlagBitMaskValues()
{
return Enum.GetValues(typeof(BitMask))
.Cast<BitMask>()
.Where(e => IsPowerOfTwo((long)e));
}

但通用版本无法编译,因为它不喜欢转换为 long

public IEnumerable<TEnum> SingleFlagEnumValues<TEnum>()
{
return Enum.GetValues(typeof(TEnum))
.Cast<TEnum>()
.Where(e => IsPowerOfTwo((long)e));
}

有什么办法解决这个问题吗?

最佳答案

您可以使用 Convert.ToInt64由于它有很多重载:

public IEnumerable<TEnum> SingleFlagEnumValues<TEnum>()
{
return Enum.GetValues(typeof(TEnum))
.Cast<TEnum>()
.Where(e => IsPowerOfTwo(Convert.ToInt64(e)));
}

根据评论中的建议,这里进行优化:

static class SingleFlagCache<TEnum>
{
internal static TEnum[] values = Enum.GetValues(typeof(TEnum))
.Cast<TEnum>()
.Where(e => IsPowerOfTwo(Convert.ToInt64(e))).ToArray();
}
public static IEnumerable<TEnum> SingleFlagEnumValues<TEnum>()
=> SingleFlagCache<TEnum>.values;

关于c# - 位掩码枚举的通用单标志枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59247510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com