从int中获取枚举值

本文关键字:枚举 获取 int | 更新日期: 2023-09-27 18:07:52

如何从int输入中获得enum值?假设我有下面这个enum。

[Flags]
public enum Weeks
{
    Sunday = 1,
    Monday = 2,
    Tuesday = 4,
    Wednesday = 8,
    Thursday = 16,
    Friday = 32,
    Saturday = 64
}
public List<Weeks> GetEnumValues(int input)
{
    // Don't know what is the logic here
    // Help is much appreciated
}

则输出如下

Examples:
1.) input = 3; This means Sunday and Monday hence 1 + 2 = 3; This should return List<Weeks> { Sunday, Monday }
2.) input = 20; This means Tuesday and Thursday hence 4 + 16 = 20; This should return List<Weeks> { Tuesday, Thursday }
3.) input = 40; This means Wednesday and Friday hence 8 + 32 = 40; This should return List<Weeks> { Wednesday, Friday }

提前感谢。

从int中获取枚举值

您可以通过循环每个enum "flag"并检查每个"flag"来做到这一点,如果比特设置在您的输入值中。这里有一种方法:

public List<Weeks> GetEnumValues(int input)
{
    Weeks inputEnum = (Weeks)input;
    var list = new List<Weeks>();
    foreach(var enumFlag in Enum.GetValues(typeof(Weeks)).Cast<Weeks>())
    {
        if (inputEnum.HasFlag(enumFlag))
        {
            list.Add(enumFlag);
        }
    }
    return list;
}

@sstan的答案是正确的,我投票作为答案。但我也想分享一下我从他的解决方案中的简短版本。

public List<Weeks> GetEnumValues(int input)
{
    Weeks inputEnum = (Weeks)input;
    return Enum.GetValues(typeof(Weeks)).Cast<Weeks>().Where(x => inputEnum.HasFlag(x)).ToList();
}

另一种方法-利用Flags枚举上的ToString构建一个逗号分隔的值列表的事实。然后,我们可以接受它,并通过enum将每个元素转换回枚举值。解析:

public List<Weeks> GetEnumValues(int input)
{
    return ((Weeks)input)
         .ToString()
         .Split(',')
         .Select(day => Enum.Parse(typeof(Weeks), day))
         .ToList();
}