C# 而不是枚举

C# 而不是枚举,c#,enums,C#,Enums,C枚举替换 我在C方面没有那么多经验, 我有一个疑问,因为我们知道,在编码时,我们能够以类似的方式从intellisense中选择枚举项,而不是枚举任何其他从intellisense获取项的可能性 我的要求是我不想要枚举,我在数据库表中有国家列。我想对每个国家/地区进行一些验证,例如: if( db.Countries.India ) { //some validation } 如果您希望intellisense向您显示集合中的数据,那么它的工作方式就不是这样的。您的C源代码无法使用数据

C枚举替换

我在C方面没有那么多经验, 我有一个疑问,因为我们知道,在编码时,我们能够以类似的方式从intellisense中选择枚举项,而不是枚举任何其他从intellisense获取项的可能性

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

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

如果您希望intellisense向您显示集合中的数据,那么它的工作方式就不是这样的。您的C源代码无法使用数据库中的数据,因为数据库中的数据可能会更改,而您的代码仍将引用一些固定名称属性


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

到目前为止,最有用的方法之一(尤其是在执行验证时)是使用:

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的回答中显示。

我不知道db是什么,也不知道为什么你不想使用枚举,因为你可以完美地做到这一点,请参见下文,但这可能会帮助你:

public class Countries
{
    public const string India = "India";
    ...
}
或者,如果您想要国家的id,您可以使用

public class Countries
{
    public const int India = 42;
    ...
}
两种建议的方法都可以通过以下方式访问:

var india = Countries.India;
CountryID | Name
------------------------------------
1         | India
42        | United States of America
public enum Country
{
    India = 1,

    [Description("United States of America")]
    United States = 42
}
我知道这没有被问到,但由于问题表明问题可能是一个问题,因此我建议采取以下方法:

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

var india = Countries.India;
CountryID | Name
------------------------------------
1         | India
42        | United States of America
public enum Country
{
    India = 1,

    [Description("United States of America")]
    United States = 42
}
然后您可以创建一个如下所示的枚举:

var india = Countries.India;
CountryID | Name
------------------------------------
1         | India
42        | United States of America
public enum Country
{
    India = 1,

    [Description("United States of America")]
    United States = 42
}
您不会丢失任何信息。

尝试以下工作:

if(db.Countries.ToList().Any(t=>t.country=="India"))
例如,我想对每个国家执行一些验证

您必须循环数据库中的所有国家/地区,而您的代码段中没有显示这些国家/地区。如果您的验证只针对少数国家,而不是所有国家,则可以使用switch语句

重要提示:枚举只会产生可维护性问题。如果明天您决定从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生成枚举类。这可以帮助您克服可维护性问题,但上面的循环仍将保留。

是否要检查数据库中的某一列的值是否为India?请停止使用不正确的文本格式,请参阅并包含。如果您需要对某些记录执行特殊操作,则可能缺少数据库中指示该记录特殊的列。像ID或名称这样的硬编码通常是糟糕的数据库设计。我不认为这是问题所在。让我们等待OP的回答。这些问题似乎不合逻辑/不完整,并且……@MickyD在输入一些内容时在触摸屏上打了个坏主意answer@zackraiyan请停止随意评论帖子。这不是一个论坛。旗帜问题instead@zackraiyan你可以问,但请先问OP而不是我们。为什么我们应该知道比OP更多的东西?这是如何回答OP的问题的?说说你的答案它是如何解决OP的问题的。只回答代码并重试这不是回答问题的好方法。枚举只会产生可维护性问题。[如果][…]您[…]从Db中删除“India”,您还必须更新您的枚举-不确定我是否明白您的意思;如果从数据库中删除一个值,则也需要更新代码中的表示形式,而不管您使用的是枚举还是其他什么。还是我错过了什么?@ThomasFlinkow,也可以反过来,如果你在db中添加新的国家,你也必须将它们添加到Enum中。我之所以说删除,是因为从数据库表中删除的特定枚举值在代码中不再重要。没错,让我重新表述一下:您说只有在使用枚举时,才必须在更新数据库表时更新它们,不是吗?