国家/地区被发送到该方法,然后我希望该方法返回该大陆。我设置的当前方式是类似于此的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;
}
这是一个好方法还是任何人都可以提出更好的方法。我不太担心处理时间,但我也不希望这个过程耗费大量时间。我更想知道我是否忽略了更好的解决方案
答案 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)
数据库工作正常 - 除非您想环顾四周,看看是否有人将其作为网络服务提供。
如果您担心多次选择导致速度慢,您可以:
从数据库下载所有内容 - 将其放入内存(作为列表,词典或其他内容),并经常更新所有内容。
如果您正在使用mysql - 上面的内容,请将其放入MEMORY表中。通过这种方式,您仍然可以使用sql代码,性能并没有那么差。
(补充:澄清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