我有一个名为Country的对象。在程序的某个时刻,我想设置每个对象的场强。
每个国家的权力都是固定的,我在一张纸上有所有196个国家的数据。例如,我的代码应检查该国家/地区的名称是否为USA(如果是,请将其权限设置为100),依此类推。
我知道我可以用开关盒做到这一点,但是最好,最好,最有效的方法是什么?
答案 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)
是吗?将外部存储空间的数据加载到字典中。
否? 使用开关
让编译器为您生成字典和基于散列的查找。 当您的探查器开始尖叫时,探索替代解决方案。 例如,请阅读“that answer”中的What is quicker, switch on string or elseif on type?。
答案 5 :(得分:0)
如何制作一个字符串数组,以便按照其权力的升序存储国家/地区名称。实施起来会更简单。然后每个国家的指数可以代表它的力量。只有当电量继续计数时才有可能。
如果不是,另一种方法是将它们作为链表实现。如果你愿意,你将能够改变。包含2个字段的列表; 1为国家和其他为权力