Tag: 枚举

为什么不同的枚举类型之间的操作允许在另一个枚举声明中而在其他地方不允许?

C#编译器允许在另一个枚举类型声明中的不同枚举类型之间进行操作,如下所示: public enum VerticalAnchors { Top=1, Mid=2, Bot=4 } public enum HorizontalAnchors { Lef=8, Mid=16, Rig=32 } public enum VisualAnchors { TopLef = VerticalAnchors.Top | HorizontalAnchors.Lef, TopMid = VerticalAnchors.Top | HorizontalAnchors.Mid, TopRig = VerticalAnchors.Top | HorizontalAnchors.Rig, MidLef = VerticalAnchors.Mid | HorizontalAnchors.Lef, MidMid = VerticalAnchors.Mid | HorizontalAnchors.Mid, MidRig = VerticalAnchors.Mid | HorizontalAnchors.Rig, BotLef = VerticalAnchors.Bot | […]

Code First Enumerations放入查找表

我曾在很多商店工作,他们运行数据库优先模型,因此总是需要查找表。 您的查找表必须与您的枚举匹配,以便保持数据库的完整性。 我100%同意这个想法,但已经发现,当涉及到Code First Model时,这不是开箱即用的。 我确实在某处读过EF团队可能会添加在EF7中动态地将Enums添加到您的数据库(通过迁移)的function,但他们警告说这不是承诺。 那么你(如果有的话)如何实现这一目标呢? 我将在下面的答案中提供我的解决方案,并期待您的反馈。 我使用的是EF 6.1.3和.NET 4.5.1

为什么我得到“collections被修改; 枚举操作可能不执行“不修改枚举的集合?

我有两个字符串集合:CollectionA是存储在系统中的对象的StringCollection属性,而CollectionB是在运行时生成的List。 如果存在任何差异,CollectionA需要更新以匹配CollectionB。 所以我设计了我期望的一个简单的LINQ方法来执行删除。 var strDifferences = CollectionA.Where(foo => !CollectionB.Contains(foo)); foreach (var strVar in strDifferences) { CollectionA.Remove(strVar); } 但我得到一个”Collection was modified; enumeration operation may not execute”错误的strDifferences …即使它是一个单独的可枚举的被修改集合! 我最初明确地设计了这个来逃避这个错误,因为我的第一个实现会产生它(因为我在CollectionA进行枚举,只是删除了!CollectionB.Contains(str) )。 谁能解释为什么这个枚举失败?

收益率的工作模式

当我有一个代码块 static void Main() { foreach (int i in YieldDemo.SupplyIntegers()) { Console.WriteLine(“{0} is consumed by foreach iteration”, i); } } class YieldDemo { public static IEnumerable SupplyIntegers() { yield return 1; yield return 2; yield return 3; } } 我可以将收益率回归的原理解释为 Main()调用SupplyIntegers() |1| |2| |3| are stored in contiguous memory block.Pointer of “IEnumerator” Moves to |1| […]

C#:接口中的枚举

我已经看到了几个与此问题类似的线索,但它们都没有真正回答我想问的问题。 对于初学者来说,不幸的是我正在使用现有的API代码,所以很遗憾,虽然可能有更好的方法来做我所要求的事情,但是由于向后兼容性不同,我已经被锁定了。 -negotiable。 我有一个响应类,当前包含一个错误代码和字符串描述的枚举。 错误代码定义了一组相当不错且完整的响应,这些响应都非常语义地耦合到使用它们的操作。 不幸的是,我现在必须为一组类似的API对象添加不同的工作流程,这将需要一个字符串描述,这很好,但也是一个包含一组完全不相关的错误代码的枚举错误代码。 错误代码(以及对象模型的其他方面)将在许多相同的类中使用,因此最好让接口运行,以便我可以通过相同的框架运行对象。 这里的目的是签订一份合同,上面写着“我有一个错误代码,以及该错误代码的描述”。 但是,据我所知,没有办法将项目添加到界面,如 public interface IError { enum ErrorCode; string Description; } 也没有办法表达 public interface IError where T: enum { T ErrorCode; string Description; } 每个人都遇到过这样的事情吗?

为什么使用flags + bitmasks而不是一系列布尔?

鉴于我有一个可能处于一个或多个真/假状态的对象的情况,我总是有点模糊为什么程序员经常使用标志+位掩码而不是仅仅使用几个布尔值。 它遍布.NET框架。 不确定这是否是最好的示例,但.NET框架具有以下内容: public enum AnchorStyles { None = 0, Top = 1, Bottom = 2, Left = 4, Right = 8 } 因此,给定锚样式,我们可以使用位掩码来确定选择哪个状态。 但是,似乎您可以使用AnchorStyle类/结构完成相同的操作,其中为每个可能的值定义bool属性,或者为单个枚举值的数组定义。 当然,我的问题的主要原因是我想知道我是否应该使用自己的代码进行类似的练习。 那么,为什么要用这种方法呢? 减少内存消耗? (它似乎不会消耗少于bools的数组/结构) 比结构或数组更好的堆栈/堆性能? 更快的比较操作? 更快的增值/删除? 编写它的开发人员更方便吗?

除了enum之外还有什么用于c#

所以目前有一个枚举用于应用程序的状态。 然而,当使用它来对抗ui时会感觉不到。 填充下拉列表时,对于整数和字符串之间的许多转换。 我可以使用扩展方法或类型转换器并继续使用枚举,如果枚举中有多个单词,这将是有用的。 我以为在挖到它之前我会要求看到填充可能的洞。 谢谢。

哪个更快/更有效:Dictionary 或Dictionary ?

当用作字典键时, 枚举类型是否比字符串类型更快/更有效? IDictionary or IDictionary 事实上,哪种数据类型最适合作为字典键,为什么? 请考虑以下事项: 注意:为简单起见,只有5个属性 struct MyKeys { public string Incomplete = “IN”; public string Submitted = “SU”; public string Processing=”PR”; public string Completed = “CO”; public string Closed = “CL”; } 和 enum MyKeys { Incomplete, Submitted, Processing, Completed, Closed } 如果在字典中用作键,上面哪个会更好!

C#:Enum反模式

有人一直在谈论Enums一般违反清洁代码原则,所以我正在寻找人们最喜欢的Enum反模式和替代解决方案。 例如,我见过这样的代码: switch(enumValue) { case myEnum.Value1: // … break; case myEnum.Value2: // … break; } 它比带有魔术字符串的switch语句更好一步,但这可能已经通过工厂,容器或其他模式更好地解决了。 甚至像这样的老派代码: if(enumValue == myEnum.Value1) { // … } else if (enumValue == myEnum.Value2) { // … } 您对枚举有哪些其他反模式和更好的实现 ?

如何避免使用枚举?

在问这里问题之前 ,我从未认为(枚举)是“坏事”。 对于那些认为它们不是最佳实践的人,有哪些方法/模式可以避免在代码中使用它们? 编辑: public Enum SomeStatus Approved = 1 Denied = 2 Pending =3 end Enum