繁体   English   中英

使用枚举存储多个真值

[英]Store multiple true values with an enum

我最近开始使用枚举来更有效地在数据库中存储信息。 我想知道是否有某种方法可以使用它们来存储多个真实值。 详细地说,在GenderEnum这样的枚举中,我会将男性存储为 0,女性存储为 1,OtherUnclear 存储为数据库中的 3。

public enum GenderEnum : short
 {
    Male,
    Female,
    OtherUnclear
  }

但是如果我想存储多个真值呢? 例如种族,某人可能是多种族的。 我将如何有效地将黑白相间的人存储在数据库中?

public enum RaceEnum : short
  {
     White,
     Black,
     Hispanic,
     Asian,
     Native,
     Unclear
  }

您可以使用允许与逻辑 OR 运算符按位混合的flags 属性,并使用 0 和 1 之后的二进制值序列将每个值设置为 2 的倍数:

[Flags]
public enum EthnicGroup : short
{
   White = 0,
   Black = 1,
   Hispanic = 2,
   Asian = 4,
   Native = 8,
   Unclear = 16
}

您可以使用 Enum.HasFlag 方法检查变量是否设置了标志。

例子

var somehuman = EthnicGroup.Black | EthnicGroup.Hispanic;

if ( somehuman.HasFlag(EthnicGroup.Asian) ) ...

资源

C# 中的 [Flags] 枚举属性是什么意思?

https://www.alanzucconi.com/2015/07/26/enum-flags-and-bitwise-operators

https://docs.microsoft.com/dotnet/api/system.flagsattribute

https://docs.microsoft.com/dotnet/api/system.enum.hasflag

如果您希望枚举类型表示选择的组合,请为这些选择定义枚举成员,以便单个选择是位字段。 要指示枚举类型声明位字段,请将Flags属性应用于它。

下面是一个简单的例子。

[Flags]
public enum Days
{
    None      = 0b_0000_0000,  // 0
    Monday    = 0b_0000_0001,  // 1
    Tuesday   = 0b_0000_0010,  // 2
    Wednesday = 0b_0000_0100,  // 4
    Thursday  = 0b_0000_1000,  // 8
    Friday    = 0b_0001_0000,  // 16
    Saturday  = 0b_0010_0000,  // 32
    Sunday    = 0b_0100_0000,  // 64
    Weekend   = Saturday | Sunday
}

public class FlagsEnumExample
{
    public static void Main()
    {
        Days meetingDays = Days.Monday | Days.Wednesday | Days.Friday;
        Console.WriteLine(meetingDays);
        // Output:
        // Monday, Wednesday, Friday

        Days workingFromHomeDays = Days.Thursday | Days.Friday;
        Console.WriteLine($"Join a meeting by phone on {meetingDays & workingFromHomeDays}");
        // Output:
        // Join a meeting by phone on Friday

        bool isMeetingOnTuesday = (meetingDays & Days.Tuesday) == Days.Tuesday;
        Console.WriteLine($"Is there a meeting on Tuesday: {isMeetingOnTuesday}");
        // Output:
        // Is there a meeting on Tuesday: False

        var a = (Days)37;
        Console.WriteLine(a);
        // Output:
        // Monday, Wednesday, Saturday
    }
}

参考: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/enum#enumeration-types-as-bit-flags

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM