用于比较和交换多个值的编程建议

时间:2012-07-26 09:41:01

标签: c# database performance algorithm switch-statement

国家/地区被发送到该方法,然后我希望该方法返回该大陆。我设置的当前方式是类似于此的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";
     }
 }

问题是我需要能够动态添加和删除国家和大陆,这种方法意味着我在添加国家或大陆时必须重新编译代码。

我想的解决方案是拥有一个包含2列,国家和大陆的数据库表,我可以轻松添加,然后有类似的内容,将被称为数千次。

 private string changeCountry(string country)
 {   
     // open db connection
     // Select continent where country = 'country'
     // close db connection
     return continent;
 }

这是一个好方法还是任何人都可以提出更好的方法。我不太担心处理时间,但我也不希望这个过程耗费大量时间。我更想知道我是否忽略了更好的解决方案

5 个答案:

答案 0 :(得分:2)

分3个步骤:

1)有你谈过的表:国家和大陆,有外键约束(国家必须在一个大陆)。

2)首次需要该数据时,请在Dictionary<string, List<string>>中加载所有数据,其中键为大陆名称,值为与其关联的国家/地区列表。
后续调用不会再次加载它,它们会重用该字典。

3)如果您想要特定国家Con的大陆Cou,您可以这样做:

string Con = myDictOfCountriesToContinent.FirstOrDefault(kv => kv.Value.Contains(Cou));

然后,您可以在数据库中添加任意数量的国家/地区,您的代码将从该信息中受益。

请注意,如果您要求DB中不存在的国家/地区,则3)中的查询将返回null。检查一下。

性能方面,字典非常好,几千次不是问题。
什么是costy是到DB的往返,你最多会得到1。

为了提高速度,如果单个大陆没有重复的国家/地区,则可以将List<string>替换为HashSet<string>

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

另一种解决方案是在配置文件中声明每个国家/地区的密钥,并在修复各大洲时为各大洲创建枚举。使用这些数据来获取国家的大陆。如果你想添加新国家,只需在配置中添加它,不需要重新编译。

答案 3 :(得分:0)

数据库工作正常 - 除非您想环顾四周,看看是否有人将其作为网络服务提供。

如果您担心多次选择导致速度慢,您可以:

  1. 从数据库下载所有内容 - 将其放入内存(作为列表,词典或其他内容),并经常更新所有内容。

  2. 如果您正在使用mysql - 上面的内容,请将其放入MEMORY表中。通过这种方式,您仍然可以使用sql代码,性能并没有那么差。

  3. (补充:澄清2 - 不要将永久数据放在该表中。复制并将其用作缓存。当数据库出现故障时,内存表内容将丢失)

答案 4 :(得分:-1)

使用字典:

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

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

//retrieving
string continent = countryContinents["Ireland"];
//continent equals Europe

可能该项目不存在,您可以检查:

string continent;
if (countryContinents.TryGetValue("Ireland", out continent))
{
    //continent equals Europe
}

对于“无重新编译”要求,您可以将此字典写入文件并在运行时(应用程序启动时)读取它。当您更改词典或退出应用程序时,将其写入文件。

http://blogs.msdn.com/b/adam/archive/2010/09/10/how-to-serialize-a-dictionary-or-hashtable-in-c.aspx