C# 比较和交换多个值的编程建议

C# 比较和交换多个值的编程建议,c#,database,performance,algorithm,switch-statement,C#,Database,Performance,Algorithm,Switch Statement,一个国家被发送到该方法,然后我希望该方法返回大陆。我当前的设置方式是类似于此的switch语句。这个方法可以调用数千次 private string changeCountry(string country) { switch (country) { case "Ireland": return "Europe"; case "England": return "Europe"; case "France":

一个国家被发送到该方法,然后我希望该方法返回大陆。我当前的设置方式是类似于此的switch语句。这个方法可以调用数千次

 private string changeCountry(string country)
 {   
     switch (country)
     {
        case "Ireland":  return "Europe";
        case "England":  return "Europe";
        case "France":   return "Europe";      
        case "Brazil":   return "America";
        case "Chile":    return "America";
     }
 }
问题是我需要能够动态地添加和删除国家和大陆,这种方法意味着我必须在添加国家或大陆时重新编译代码

我想的解决方案是有一个数据库表,有两列,国家和大陆,我可以很容易地添加到其中,然后有这样的东西,它将被调用数千次

 private string changeCountry(string country)
 {   
     // open db connection
     // Select continent where country = 'country'
     // close db connection
     return continent;
 }
这是一个好方法还是有人能推荐一个更好的方法。我不太担心处理时间,但我也不希望处理时间过长。我更想知道我是否忽略了一个更好的解决方案

使用字典:

Dictionary countryContinents = new Dictionary<string,string>();

//add items
countryContinents.Add("Ireland","Europe");

//retrieving
string continent = countryContinents["Ireland"];
//continent equals Europe
对于“无需重新编译”要求,您可以将此字典写入文件,并在运行时(应用程序启动时)将其读入。并在更改字典或退出应用程序时将其写入文件

使用字典:

Dictionary countryContinents = new Dictionary<string,string>();

//add items
countryContinents.Add("Ireland","Europe");

//retrieving
string continent = countryContinents["Ireland"];
//continent equals Europe
对于“无需重新编译”要求,您可以将此字典写入文件,并在运行时(应用程序启动时)将其读入。并在更改字典或退出应用程序时将其写入文件


如果内容是动态的,则无法硬编码数据。我不认为查询数据库几千次会影响性能


但是这几千个请求的频率是多少?

如果内容是动态的,那么您就不能硬编码数据。我不认为查询数据库几千次会影响性能


但这几千个请求的频率是多少?

从维护的角度来看,我建议您在数据库中创建一个查找表,并使用它来获得结果


另一个解决方案是在配置文件中声明每个国家的密钥,并在大陆固定时创建大陆的枚举。使用这些数据获取国家的大陆。如果您想添加新的国家/地区,只需将其添加到配置中,无需重新编译。

从维护的角度来看,我建议您在数据库中创建一个查找表,并使用它来获得结果

另一个解决方案是在配置文件中声明每个国家的密钥,并在大陆固定时创建大陆的枚举。使用这些数据获取国家的大陆。如果要添加新的国家/地区,只需在配置中添加,无需重新编译。

分3步进行:

1) 准备好您讨论过的表格:国家和大陆,带有外键约束(国家必须位于大陆)

2) 第一次需要该数据时,请将所有数据加载到
字典中,键为大陆名称,值为与之关联的国家列表。
后续调用不会再次加载该字典,而是重用该字典

3) 当您需要某个特定国家的大陆
Con
Cou
时,您可以执行以下操作:

string Con = myDictOfCountriesToContinent.FirstOrDefault(kv => kv.Value.Contains(Cou));
然后,您可以在DB中添加任意数量的国家和大陆,您的代码将从该信息中受益。

请注意,如果您请求数据库中不存在的国家,则3)中的查询将返回null。进行相应的检查

性能方面,字典都很好,几千次都不是问题
成本是到DB的往返行程,您最多只能得到1

为了提高速度,如果单个大陆上没有重复的国家,您可以将
列表
替换为
哈希集

分三步进行:

1) 准备好您讨论过的表格:国家和大陆,带有外键约束(国家必须位于大陆)

2) 第一次需要该数据时,请将所有数据加载到
字典中,键为大陆名称,值为与之关联的国家列表。
后续调用不会再次加载该字典,而是重用该字典

3) 当您需要某个特定国家的大陆
Con
Cou
时,您可以执行以下操作:

string Con = myDictOfCountriesToContinent.FirstOrDefault(kv => kv.Value.Contains(Cou));
然后,您可以在DB中添加任意数量的国家和大陆,您的代码将从该信息中受益。

请注意,如果您请求数据库中不存在的国家,则3)中的查询将返回null。进行相应的检查

性能方面,字典都很好,几千次都不是问题
成本是到DB的往返行程,您最多只能得到1


为了提高速度,如果一个大陆上没有重复的国家,您可以将
列表
替换为
哈希集

数据库可以正常工作,除非您想四处看看是否有人将其作为web服务提供

如果您担心由于多次选择而导致的速度缓慢,您可以:

  • 从数据库中下载所有内容一次-将其放入内存(作为列表、字典或任何东西),并每隔一段时间更新所有内容

  • 如果您使用的是mysql,请执行上述操作,但请将其放入内存表中。这样,您仍然可以使用sql代码,而且性能也不会差得多


  • (补充:澄清2-不要将永久数据放在该表中。复制它并将其用作缓存。当数据库关闭时,内存表内容将丢失)

    数据库将正常工作-除非您想四处看看是否有人将其作为web服务提供

    如果您担心由于多次选择而导致的速度缓慢,您可以:

  • 从数据库中下载所有内容一次-将其放入内存(作为列表、字典或任何东西),并每隔一段时间更新所有内容

  • 如果您使用的是mysql,请执行上述操作,但请将其放入内存表中。这样,您仍然可以使用sql代码