Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C与EF枚举,查找表和传递它的值?_C#_Entity Framework_Enums_Lookup Tables - Fatal编程技术网

C# C与EF枚举,查找表和传递它的值?

C# C与EF枚举,查找表和传递它的值?,c#,entity-framework,enums,lookup-tables,C#,Entity Framework,Enums,Lookup Tables,我正在接管一个C项目,我遇到了一个我不熟悉的概念 该项目正在使用EF从枚举创建查找表。UI接受多选输入,但接收模型接受枚举类型,而不是列表/数组或其他表示复数的内容 枚举似乎具有某种递归关系 public enum Options { None = 0, [Display(Name = @"On-site Security")] OnSiteSecurity = 1 << 0, [Display(Name = @"Gated Entry")]

我正在接管一个C项目,我遇到了一个我不熟悉的概念

该项目正在使用EF从枚举创建查找表。UI接受多选输入,但接收模型接受枚举类型,而不是列表/数组或其他表示复数的内容

枚举似乎具有某种递归关系

public enum Options
{
    None = 0,

    [Display(Name = @"On-site Security")]
    OnSiteSecurity = 1 << 0,

    [Display(Name = @"Gated Entry")]
    GatedEntry = OnSiteSecurity << 1,

    [Display(Name = @"Gated Entry - Video")]
    GatedEntryVideo = GatedEntry << 1,

    [Display(Name = @"Closed-Circuit TV")]
    CCTV = GatedEntryVideo << 1, ...

我不明白这怎么能接受复数选择

听起来像是在实施。这允许您拥有一个可以表示多个不同值的枚举值

这里有一个简短的例子

class Program
{
    static void Main(string[] args)
    {
        FlaggedEnum fruitbowl = FlaggedEnum.Apples | FlaggedEnum.Oranges | FlaggedEnum.Pears;

        Console.WriteLine(fruitbowl);

        Console.ReadLine();
    }
}

[Flags]
enum FlaggedEnum
{
    None = 0,
    Apples = 1,
    Pears = 2,
    Oranges = 4,
    Pineapples = 8
}
当你运行这个程序时,你会得到苹果、桔子、梨的输出。其整数值为7 4+2+1

二次幂的原因是它们的二进制等价物,1=1,2=10,4=100,8=1000。。。因此,7的值为111


我希望这至少能让您走上正确的道路。

这个概念被称为“标志枚举”,允许您通过将枚举值视为位值标志,将枚举值的任意组合存储在单个类型中。有关详细信息,请参阅。这样,按位或仅合并值的位值,枚举就知道如何处理它了?指数表值的作用是什么?抱歉,我只是想知道所有的播放器在这里做什么这解释了一个预先存在的DB表中的数字56,其中56远远超出枚举的范围。。。另一方面,为什么?我知道算法很酷,但是现在db服务器速度很快,对我来说,在我缺乏经验的情况下,感觉像是过度杀戮和魔镜的面具,如果它…增加了混乱,它涉及到一个OR ish运算符……这不令人困惑吗?a+1表示与我的名字和首字母相同:我发现使用按位或令人困惑,你很少看到它。您可以为枚举编写扩展方法来隐藏它,并允许您使用更可读的语法,请参阅。你为什么要用它?它只涉及很少的数据存储,您可以设置多个值,但只能在数据库中存储一个。@MarkHollas:Flags是C语言和前代语言中最基本、最常用的概念。对于最初的实现者来说,它很可能是在C端表示数据的最自然的方式。javascript中的手动或运算符是javascript不支持标志概念的一个不幸的副作用,并且可能确实是在js/c层之间通信时使用不同数据类型或转换数据类型的一个参数。@mark_h我现在可以看到这一点了。我几乎就知道我是怎么想的,但一旦有了这样明确的澄清,我很可能会亲自实施。我只是想说,有时候我认为有太多的模式可以让代码运行得更快,但似乎会影响可读性和人类理解。计算机将以更快的速度增长,而这些收益可能可以忽略不计。。。那么,为什么不让它变得可读呢?节省更多的时间,让人类来维护项目
class Program
{
    static void Main(string[] args)
    {
        FlaggedEnum fruitbowl = FlaggedEnum.Apples | FlaggedEnum.Oranges | FlaggedEnum.Pears;

        Console.WriteLine(fruitbowl);

        Console.ReadLine();
    }
}

[Flags]
enum FlaggedEnum
{
    None = 0,
    Apples = 1,
    Pears = 2,
    Oranges = 4,
    Pineapples = 8
}