C# 比较和交换多个值的编程建议
一个国家被发送到该方法,然后我希望该方法返回大陆。我当前的设置方式是类似于此的switch语句。这个方法可以调用数千次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":
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代码