1

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

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

4

5 回答 5

2

分 3 步:

1)有你谈到的表:国家和大陆,具有外键约束(国家必须在大陆中)。

2) 第一次需要该数据时,将所有数据加载到 aDictionary<string, List<string>>中,键是大陆名称,值是与其关联的国家/地区列表。
随后的调用不会再次加载它,它们会重用该字典。

Con3)当你想要一个特定国家的大陆时,Cou你可以这样做:

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

然后,您可以在 DB 中添加任意数量的国家和大洲,您的代码将从这些信息中受益。

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

性能方面,字典非常好,几千次不是问题。
昂贵的是往返DB,最多只能赚1。

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

于 2012-07-26T09:55:31.877 回答
0

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

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

于 2012-07-26T09:50:43.637 回答
0

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

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

于 2012-07-26T09:50:43.527 回答
0

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

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

  1. 从数据库中下载所有内容一次 - 将其放入内存(作为列表、字典或其他内容)并每隔一段时间更新一次所有内容。

  2. 如果您使用的是 mysql - 以上但将其放入 MEMORY 表中。这样你仍然可以使用 sql 代码,性能也不会差很多。

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

于 2012-07-26T09:55:41.260 回答
-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
}

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

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

于 2012-07-26T09:48:21.460 回答