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



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

每个国家的功率是固定的,我在一张纸上有所有196个国家的数据。例如,我的代码应该检查国家/地区的名称是否为美国(如果是,则将其幂设置为 100(等等。

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

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

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

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

虽然塞尔曼的回答是正确的,但它并没有回答如何实际填充字典。是这样的:

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-方法 填充该存储中的每条记录。

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

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

既然你说你有一个名为"Country"的"对象",并且你已经标记了你的问题"C#",那么你的代码中似乎有两个力量在起作用。一个是必须引用映射,无论多么有效地实现,都不像引用成员变量那么便宜。另一方面,设置可能会有一些好处,其中一个国家/地区的所有属性都可以与其他国家/地区的属性在同一位置找到(面向地图的解决方案确实解决了这个问题(。但是这些力量可以像这样调和:

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));
    // ....
}

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

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

  • 否? 使用开关

    让编译器为您生成字典和基于哈希的查找。当您的探查器开始尖叫时,请探索替代解决方案。例如,从"什么更快,打开字符串还是在类型上?"中阅读该答案。

制作一个字符串数组,用于按其权力的升序存储国家/地区名称怎么样?实施起来会更简单。然后每个国家的指数可以代表其实力。这是可能的,只有当权力继续计数数字时。

如果不是,另一种方法是将它们实现为链表。这样您就可以根据需要进行更改。包含 2 个字段的列表;1为国家,其他为权力

最新更新