关于c#:什么是大型开关盒的良好替代品?

What is a good substitute for a big switch-case?

我有一个叫国家的东西。在程序的某个时刻,我想设置每个对象的场功率。

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

我知道我可以用一个开关盒来做,但是什么是最好、最好和最有效的方法呢?


您可以将国家电源对存储到Dictionary中,然后使用索引器获取特定国家的分数:

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

编辑:正如注释中建议的那样,您应该将信息存储在外部文件中,例如XML是一个不错的选择。这样就不必修改代码来添加或删除国家。您只需要将它们存储到XML文件中,在需要的时候对其进行编辑,然后在程序启动时对其进行解析,并将值加载到Dictionary中。您可以使用LINQ to XML来实现这一点。如果您还没有使用它,文档中就有了一些好的示例来启动。


虽然塞尔曼的答案是正确的和好的,但它不回答如何实际填充字典。这里是:

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

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

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

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

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

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


这是一个正确的问题,但你需要学习很多东西。许多人都回答了你的问题。我会很恼人的禅宗,告诉你不要问这个问题,因为有一个更大的问题要解决。

不要对此进行硬编码,而是将相关属性存储在N元组(也称为数据库行)中,并使用数据库引擎来管理这两者之间的关系。然后,由于您使用的是C,学习使用LINQ可能是明智的。但是在你做这件事之前,先学习一些数据建模理论,因为数据建模就是你要做的。


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

  • 对?将数据从外部存储器加载到字典中。

  • 不?使用开关

    让编译器为您生成字典和基于哈希的查找。当你的剖析者开始尖叫时,探索其他的解决方案。例如,从"什么更快,打开字符串或Elseif打开类型?".


既然您说您有"对象"称为"国家",并且您已经将您的问题标记为"c",那么您的代码中似乎有两种力量在起作用。一个是,必须引用一个映射,不管它如何有效地实现,都不如引用一个成员变量便宜。另一方面,如果一个国家的所有属性都可以与其他国家的属性在同一个地方找到(面向地图的解决方案确实解决了这一问题),那么这种设置可能会带来一些好处。但是这些力量可以像这样调和:

1
2
3
4
5
6
7
8
9
10
11
12
13
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));
    // ....
}

制作一个字符串数组来按国名的权力升序存储国名怎么样?实施起来比较简单,每个国家的指数就可以代表它的力量。这是可能的,只有当电源继续计数时。

如果不是,另一种siple方法是将它们实现为链表。如果你愿意,你可以改变。包含两个字段的列表;1表示国家,1表示其他国家。