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

时间:2014-12-17 15:27:40

标签: c# switch-statement case

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

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

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

6 个答案:

答案 0 :(得分:54)

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

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

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

答案 1 :(得分:24)

虽然塞尔曼斯的回答是正确和好的,但它没有回答如何实际填充词典。这是它:

var map = new Dictionary<string, int> {
    {"USA", 100},
    {"Germany", 110}
};

您也可以按如下方式添加:

map.Add("USA", 100);
map.Add("Germany", 110);

现在您可以访问该值(如Semans所述):

map["USA"] = 50;        // set new value for USA
int power = map["USA"]; // get new value

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:2)

因为你说你有&#34;对象&#34;呼叫&#34;国家&#34;,并且您已经标记了您的问题&#34; C#&#34;,您的代码中似乎有两种力量在起作用。一个是必须引用地图,无论如何有效实施,都不如引用成员变量那么便宜。另一方面,对于一个设置可能会有一些好处,其中一个国家的所有属性可以在与其他国家的属性相同的地方找到(面向地图的解决方案确实解决了这个问题)。但这些力量可以这样调和:

class Country { // Apologies that this sketch is more C++ than C#
public:
   Country(string name_, int power_);
private:
   string name;
   int power;
};
void MakeCountries()
{
    countries.Add(new Country("USA", 50));
    countries.Add(new Country("Germany", 60));
    // ....
}

答案 4 :(得分:2)

您是否需要在运行时更新数据?

答案 5 :(得分:0)

如何制作一个字符串数组,以便按照其权力的升序存储国家/地区名称。实施起来会更简单。然后每个国家的指数可以代表它的力量。只有当电量继续计数时才有可能。

如果不是,另一种方法是将它们作为链表实现。如果你愿意,你将能够改变。包含2个字段的列表; 1为国家和其他为权力

相关问题