【问题标题】:Instead of Enum [closed]而不是枚举[关闭]
【发布时间】:2018-04-26 05:53:09
【问题描述】:

C# 枚举替代

我在 C# 方面没有太多经验, 我有一个疑问,正如我们所知,在编码时,我们可以以类似的方式从智能感知中选择 Enum 项目,而不是 Enum 任何其他从智能感知获取项目的可能性。

我的要求是我不想要枚举,我在数据库表中有国家列。我想对每个国家进行一些验证,例如:

if( db.Countries.India )
{
   //some validation
}

【问题讨论】:

  • 您要检查数据库的列是否具有India 的值?
  • 请停止使用不正确的文本格式
  • 如果您需要对某些记录执行特殊操作,可能您在数据库中缺少一个表明该记录是特殊的列。 ID 或名称之类的硬编码通常是糟糕的数据库设计

标签: c# enums


【解决方案1】:

我不知道db 是什么,或者你为什么不想使用enum(因为你可以完美地做到这一点,见下文),但也许这可以帮助你:

public class Countries
{
    public const string India = "India";
    ...
}

或者如果你想要国家的id,​​你可以使用

public class Countries
{
    public const int India = 42;
    ...
}

两种建议的方式都可以这样访问:

var india = Countries.India;

我知道这不是被问到的,但由于问题表明问题可能是XY problem,因此我推荐以下方法:

假设您的国家/地区表如下所示:

CountryID | Name
------------------------------------
1         | India
42        | United States of America

那么你可以创建一个如下所示的枚举:

public enum Country
{
    India = 1,

    [Description("United States of America")]
    United States = 42
}

而且您不会丢失任何信息。

【讨论】:

    【解决方案2】:

    如果您希望智能感知向您显示集合中的数据,那么它不是这样工作的。您的 C# 源代码不能使用 DB 中的数据,因为 DB 中的数据可能会发生变化,而您的代码仍会引用一些固定名称属性。


    如果您希望智能感知在您点击点键“.”时向您显示一些可用的函数(扩展函数),那么您必须在开头包含定义这些函数的命名空间您的文件,以便让智能感知显示可能性。

    到目前为止,最有用的方法之一是使用:

    using System.Linq;
    

    在文件的开头

    然后你可以使用这样的东西:

    if (db.Countries.Any(c => c.Name == "India" ) {
         // this block will execute only if at least one country is India
    }
    
    foreach (var country in db.Countries.Where(c => c.Name == "India")) {
         // this block will execute for each element in countries that has Name equals India and attach the country to some variable so you can perform more work with it
    }
    

    如果您想以某种方式获得一个固定值列表,例如枚举,一些有趣的方法是使用常量,这已在 Thomas 的回答中显示。

    【讨论】:

    • 我不认为这是问题要问的。
    • 让我们等待 OP 的回复。这些问题似乎不合逻辑/不完整,并且......
    • @MickyD 在输入一些答案时触摸屏被击中
    • @zackraiyan 请停止随意评论帖子。这不是论坛。改为标记问题
    • @zackraiyan 您可以这样做,但请询问 OP 而不是我们。为什么我们应该比 OP 了解更多?
    【解决方案3】:

    例如,我想对每个国家/地区执行一些验证

    你必须循环数据库中的所有国家,这在你的 sn-p 中没有显示。如果您的验证仅针对少数国家而不是全部,您可以使用 switch 语句。

    重要提示: Enum 只会造成可维护性问题。如果明天您决定从 Db 中删除“India”,您还必须更新您的枚举。

    foreach (var country in db.Countries)
    {
         switch(country.Name)
         {
              case "India": 
                   // do my stuff when country is India
              break;
              case "Singapore": 
                   // do my stuff when country is Singapore
              break;
              default:
                  // default operation for other countries.
              break;
         }
    }
    

    作为替代方法,您可以运行预构建脚本以从 Db 生成枚举类。这可以帮助您克服可维护性问题,但上述循环仍然存在。

    【讨论】:

    • “枚举只会产生可维护性问题。[如果] [...] 您 [...] 从 Db 中删除 'India',您还必须更新您的枚举” i> - 不知道我是否明白你的意思;如果您从数据库中删除一个值,您还需要更新代码中的表示形式,无论您使用的是枚举还是其他。还是我错过了什么?
    • @ThomasFlinkow,也可以反过来,如果你在 db 中添加新的国家,你也必须将它们添加到 Enum。为什么我说删除是因为从数据库表中删除时特定的枚举值在代码中不再重要。
    • 你说得对,让我改一下:你说只有在使用枚举时你必须在更新数据库中的表时更新它们,不是吗? ?
    【解决方案4】:

    试试这个工作:

    if(db.Countries.ToList().Any(t=>t.country=="India"))
    

    【讨论】:

    • 这如何回答 OP 的问题?
    • 说说你的回答如何解决 op 的问题? .Code only answer and try this is not good way to answer.
    猜你喜欢
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    相关资源
    最近更新 更多