什么是大型开关盒的良好替代品?

nas*_*sim 31 c# case switch-statement

我有一个名为Country的对象.在程序的某个时刻,我想设置每个对象的场强.

每个国家的权力是固定的,我在一张纸上有所有196个国家的数据.例如,我的代码应该检查国家/地区的名称是否为USA(如果是,则将其功率设置为100),依此类推.

我知道我可以用开关盒做到这一点,但是最好,最好,最有效的方法是什么?

Sel*_*enç 54

您可以将国家/电源对存储到a中,Dictionary<string, int>然后使用索引器获取特定国家/地区的分数:

var points = new Dictionary<string,int>();
// populate the dictionary...
var usa = points["USA"];
Run Code Online (Sandbox Code Playgroud)

编辑:正如评论中建议的那样,您应该将信息存储在外部文件中,例如xml将是一个不错的选择.这样您就不必修改代码来添加或删除国家/地区.您只需将它们存储到XML文件中,然后在需要时进行编辑.然后在程序启动时解析它,并将值加载到Dictionary.您可以使用它LINQ to XML.如果您之前没有使用它,那么在帮助您入门的文档.

  • 我建议将数据存储在文件或数据库中,即不在代码中!196个数据集的数量绝对不适合硬编码. (11认同)
  • 为了补充@ComFreek所说的,JSON非常适合,并且是一种很好的可移植格式,可以很容易地解析成字典. (5认同)
  • 对于提倡外部文件的人:KISS,YAGNI!OP告诉我们"每个国家的力量都是固定的".硬编码是一个很好的解决方案,如果需要可以很容易地进行改进.当然,要求可能会改变,但也许不会改变.看看管理外部资源增加的复杂性:文件丢失,编码错误,损坏; 现在处理异常,记录错误,通知用户.此外,一个简单的开关就足够了:编译器无论如何都会生成一个字典(参见我的回答). (3认同)

Him*_*ere 24

虽然塞尔曼斯的回答是正确的,但却没有回答如何实际填充词典.就这个:

var map = new Dictionary<string, int> {
    {"USA", 100},
    {"Germany", 110}
};
Run Code Online (Sandbox Code Playgroud)

但是你也可以按如下方式添加它:

map.Add("USA", 100);
map.Add("Germany", 110);
Run Code Online (Sandbox Code Playgroud)

现在您可以访问该值(如Semans已经提到的):

map["USA"] = 50;        // set new value for USA
int power = map["USA"]; // get new value
Run Code Online (Sandbox Code Playgroud)

编辑:正如在评论和其他答案中已经提到的,您当然可以将数据存储在外部文件或任何其他数据存储中.说完这个之后,您可以初始化一个空字典,然后使用之前为该存储中的每条记录提到的Add方法填充它.

  • @Cory - 一个配置文件可能是一件很棒的事情,所以我并不完全不同意你,但我无法抗拒指出相反的可能性:如果列表不太可能经常改变,它可能会消耗更多开发人员决定文件格式的时间,编写解析文件的代码,处理"找不到文件"或解析错误,修复错误,...... :-) (6认同)
  • 如果此列表发生更改并且您希望在不占用开发人员时间的情况下进行维护,则应从易于编辑的配置文件中加载值. (5认同)

Pet*_*one 6

这是一个正确的问题,但是你需要学习很多东西.很多人都给你答案.我会讨厌禅宗并告诉你解开这个问题,因为要解决一个更大的问题.

而不是硬编码此,存储在一个n元组也被称为数据库行相关的性能和使用数据库引擎来管理关系,两者之间.然后,因为您正在使用C#,所以学习使用LINQ可能很聪明.但在此之前,请先学习一些数据建模理论,因为数据建模就是您正在做的事情.

  • "当你唯一的工具是锤子时,一切看起来都像钉子." 引入数据库似乎对此问题严重矫枉过正.但我同意建议从文件加载数据而不是硬编码的答案. (3认同)
  • 哇!!谢谢所有这些解决方案.我学到了很多东西!直到一个月前,我唯一的工具是数组,所以即使字典也是我的升级!:D但是我学得很快,多亏你们 (2认同)