enum bitwise/flags 实例枚举/迭代/foreach

发布于 2024-12-14 11:21:00 字数 379 浏览 2 评论 0原文

整个枚举迭代

foreach (Suit suit in Enum.GetValues(typeof(Suit)))
{
    // ...
}

但是如何迭代按位枚举实例呢?

Suit mySuits = Suit.Hearts | Suit.Diamonds;
// How to now iterate mySuits, which should loop twice instead of four times?

Whole enum iteration

foreach (Suit suit in Enum.GetValues(typeof(Suit)))
{
    // ...
}

But how To iterate a bitwise enum Instance?

Suit mySuits = Suit.Hearts | Suit.Diamonds;
// How to now iterate mySuits, which should loop twice instead of four times?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

澜川若宁 2024-12-21 11:21:00

假设 Suit 是一个没有重叠值的按位枚举,那么这就足够了:

var availableSuits = Enum.GetValues(typeof(Suit)).Cast<Enum>();
foreach (Suit suit in availableSuits.Where(mySuits.HasFlag)) {
    // ...
}

如果它需要快速,或者如果它需要忽略复合值或零值,那么您可能应该检查在 for 循环中连续计算 2 的幂,并确定哪些值与该方式匹配。

Assuming Suit is a bitwise enum with no overlapping values, then this would be sufficient:

var availableSuits = Enum.GetValues(typeof(Suit)).Cast<Enum>();
foreach (Suit suit in availableSuits.Where(mySuits.HasFlag)) {
    // ...
}

If it needs to be fast, or if it needs to ignore composite values or a zero value, then you should probably instead check successive powers of two in a for loop and identify which values match that way.

迎风吟唱 2024-12-21 11:21:00

我的建议:

foreach (var item in Enum.GetValues(typeof(Suit)).Cast<Enum>().Where(item => mySuit.HasFlag(item)))
{
    // Do something
}

My suggestion:

foreach (var item in Enum.GetValues(typeof(Suit)).Cast<Enum>().Where(item => mySuit.HasFlag(item)))
{
    // Do something
}
我一向站在原地 2024-12-21 11:21:00

不完美(拳击),但它完成了工作......

/// <summary>
/// Return an enumerators of input flag(s)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static IEnumerable<T> GetFlags<T>(this T input)
{
    foreach (Enum value in Enum.GetValues(input.GetType()))
    {
        if ((int) (object) value != 0) // Just in case somebody has defined an enum with 0.
        {
            if (((Enum) (object) input).HasFlag(value))
                yield return (T) (object) value;
        }
    }
}

用法:

    FileAttributes att = FileAttributes.Normal | FileAttributes.Compressed;
    foreach (FileAttributes fa in att.GetFlags())
    {
        ...
    }

Not perfect (boxing), but it does the job...

/// <summary>
/// Return an enumerators of input flag(s)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static IEnumerable<T> GetFlags<T>(this T input)
{
    foreach (Enum value in Enum.GetValues(input.GetType()))
    {
        if ((int) (object) value != 0) // Just in case somebody has defined an enum with 0.
        {
            if (((Enum) (object) input).HasFlag(value))
                yield return (T) (object) value;
        }
    }
}

Usage:

    FileAttributes att = FileAttributes.Normal | FileAttributes.Compressed;
    foreach (FileAttributes fa in att.GetFlags())
    {
        ...
    }
泅渡 2024-12-21 11:21:00

枚举只是一种值类型 - 它是不可迭代的。

An enum is just a value type - it is not iterable.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文