2012-07-26 50 views
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; 
} 

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

+0

旁注:我会做2个表:大洲和国家与一对多关系。并且将所有内容加载到某种集合中 - 仅仅为了不向DB调用数千次。 – Reniuz 2012-07-26 09:53:18

回答

-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

+0

对于任何更改,这仍然需要代码编译。 – Rawling 2012-07-26 09:50:22

+0

这是关于动态添加数据而不重新编译代码的问题。 – Reniuz 2012-07-26 09:50:27

+0

您认为数据将从哪里加载到字典中? – ABH 2012-07-26 09:52:06

0

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

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

+1

数千次查询数据库肯定会影响性能。 – 2012-07-26 10:02:16

+0

但不是这样一个简单的查询。 – Shashwat 2012-07-26 10:29:17

+0

即使查询并不昂贵,往返也是如此。 – 2012-07-26 11:26:06

0

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

另一个解决方案是在配置文件中为每个国家声明关键字,并在大洲已修复时为各大洲创建枚举。使用这些数据获取该国的大陆。如果你想添加新的国家,只需将其添加到配置中,不需要重新编译。

2

在3个步骤:

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

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

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

然后,您可以添加任意多的国家和大洲的DB和你的代码将从中受益的信息:

当你想要一个特定国家的大陆ConCou你可以做3)。

请注意,如果您要求的国家不存在于数据库中,则3)中的查询将返回空值。相应地检查。

性能方面,字典非常好,数千次不是问题。
什么是costy是往返数据库,你最多只能做1个。

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

+0

+1扩展我的想法我在评论:) – Reniuz 2012-07-26 10:11:58

0

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

如果由于多个选择,你既可以在担心速度变慢:

  1. 下载一切从数据库一次 - 放入内存(如列表,字典或其他)和更新每隔一段时间一次。

  2. 如果你正在使用mysql-上面的,但把它放到一个MEMORY表中。这样你仍然可以使用sql代码,性能并没有那么糟糕。

(补充:澄清2 - 不要将永久数据在表中复制并使用它作为高速缓冲存储器表内容会丢失当数据库出现故障。)