c# - 如何在跳过某些值的同时遍历枚举类型?

标签 c# enums iteration

我的问题的关键部分是跳过。我计划使用具有大约 20 个元素的枚举类型。我想遍历这个集合,但每次都需要跳过一两个元素。跳过什么是事先知道的。一个类似的例子是枚举类型,它由所有字母组成,在迭代时,我想跳过所有元音。

我应该如何以优雅/高效的方式编写迭代代码?我应该单独制作一组由元音组成的元素吗?我没有代码可以展示,因为我只是在思考这个问题。

最佳答案

var query = Enum.GetValues(typeof(MyEnum))
    .Cast<MyEnum>()
    .Except(new MyEnum[] { MyEnum.A, MyEnum.E });
foreach (MyEnum item in query) {
    ...
}

您需要转换才能获得 LINQ 的魔力。 Except一个人做不到。


更新:

我有另一个想法。您可以使用 FlagsAttribute 定义枚举并将常规值定义为 2 的幂,这是按位左移运算符最容易实现的 << .从 C# 7.0 开始,您还可以使用二进制文字,例如 0b_0000_0000_0010_0000 .然后可以组合现有值以形成新值。

[Flags]
enum MyEnum
{
    None = 0,
    A = 1 << 0,
    B = 1 << 1,
    C = 1 << 2,
    D = 1 << 3,
    E = 1 << 4,
    ...
    X = 1 << 23,
    Y = 1 << 24,
    Z = 1 << 25,
    Vowels = A | E | I | O | U
}

现在,您可以像这样制定查询

IEnumerable<MyEnum> query = Enum.GetValues(typeof(MyEnum))
    .Cast<MyEnum>()
    .Where(x => (x & MyEnum.Vowels) == MyEnum.None);
foreach (MyEnum item in query) {
    ...
}

与第一个解决方案相比的优势在于,您可以使用单个按位与操作执行测试。

您最多可以定义 32 个 2 的幂。如果需要更多,可以将枚举的基类型定义为 long并使用最多 64 个标志值(加上现有标志值的组合)。

[Flags]
enum MyEnum : long
{
    ...
}

关于c# - 如何在跳过某些值的同时遍历枚举类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9671939/

相关文章:

c# wpf 在windows右键上下文菜单中设置链接

c# - 为什么 C# 整数输入不接受正确的值?

C# Throw 被最后一次捕获

c++ - #ifdef 不接受枚举定义

python-3.x - 如何将 reduce 函数的每次迭代存储在列表中?

c# - 从线程返回一个值?

java - Spring Boot - 字符串到枚举的转换接受枚举的值和索引。如何拒绝数字输入并仅接受枚举值?

entity-framework - 仅生产错误 - "The specified value is not an instance of type ' Edm.Int3 2' Parameter name: value"

c# - 遍历列表并从中删除项目的最佳方法?

arrays - 如何在远程 ssh bash 命令中迭代本地数组