C#Enum - 给出int输入的猜测标志

时间:2015-04-28 10:49:46

标签: c# enums flags

假设我们有以下Enum of Flags:

[Flags]
    public enum Animals
    {
        Cow = 1,

        Duck = 2,

        Goose = 4
    }

现在,给定这个Enum,我们想要指定一个以int作为输入的函数,并且给定这个数字,我们想要返回一个包含该数字包含的动物的数组。

例如,如果我们收到数字7作为输入,我们知道我们有一只牛,一只鸭子和一只鹅,因为4 + 2 + 1 = 7。

对于此枚举中出现的任何数量的动物,我们如何确定该数字中包含哪些动物?

3 个答案:

答案 0 :(得分:6)

public static IEnumerable<Animals> GetAnimals(int i)
{
    var animals = (Animals) i;

    foreach (Enum value in Enum.GetValues(animals.GetType()))
        if (animals.HasFlag(value))
            yield return (Animals) value;
}

小提琴:https://dotnetfiddle.net/yydUE2

答案 1 :(得分:1)

通用版本 - 不会过快,可能会有所改进......

void Main()
{
    var flags = Ext.GetFlags<Animal>(7);
    flags.Dump();
}

public static class Ext
{
    public static IEnumerable<T> GetFlags<T>(int flags)
    where T : struct    
    {
        return typeof(T).GetEnumValues().Cast<T>()
            .Where(a => ((dynamic)(T)(object)flags).HasFlag(a)).ToList();
    }
}

[Flags]
public enum Animal
{
    Cow =1,
    Duck = 2,
    Goose = 4,
    Dog = 8
}

答案 2 :(得分:1)

正如其他人所说的那样,绝大多数情况都没有一个答案,但是举个例子我假设你想要一个贪婪的猜测算法来返回最小数量的较大值的动物:

ALTER TABLE foo ALTER COLUMN index_order TYPE NUMERIC(26, 16);