在C#中使用词典

时间:2013-05-22 23:04:47

标签: c# dictionary

我是一个古老的程序员,所以我很习惯滥用数组,但我需要开始使用字典,因为它们可以动态扩展而数组不能。

现在......我需要填充太阳系的值,太阳系中的每个物体可能有大约20-30个不同的值。

我的意图是使用一个字典,其中每个正文都有自己唯一的密钥和值,例如......

Dictionary<int,string> BodyName = new Dictionary<int,string>()
Dictionary<int,int> BodySize = new Dictionary<int,int>()
Dictionary<int,int> BodyX = new Dictionary<int,int>()
Dictionary<int,int> BodyY = new Dictionary<int,int>()
Dictionary<int,int> BodyVelocity = new Dictionary<int,int>()

等...

我的问题是从所有这些词典中检索值的最佳方法是什么? 每个'body'的关键在每个字典中是相同的。我知道我可以用很多循环来做这个,但这对CPU周期来说似乎很浪费,对我来说这是件坏事。

我也考虑过词典,列表但是还有其他我不喜欢的问题。

2 个答案:

答案 0 :(得分:10)

创建一个复合类型,然后使用它。

坚持使用词典是合适的如果键是唯一标识符 - 行星ID?一个星球的名字? - 必须用于查找数据。不要忘记对字典的迭代是不确定的。

Dictionary<int,PlanetaryBody> Bodies = new Dictionary<int,PlanetaryBody>()

另一方面,如果行星仅被迭代(或通过位置索引访问),则序列是合适的。在这种情况下,使用List通常效果很好。

List<PlanetaryBody> Bodies = new List<PlanetaryBody>();
// Unlike arrays, Lists grows automatically! :D
Bodies.Add(new PlanetaryBody { .. }); 

(我很少在List上选择一个数组 - 有时候更好,但不经常。)


复合类型(即class)用于将不同属性分组为更大的概念或分类组:

class PlanetaryBody {
    public string Name { get; set; }
    public double Mass { get; set; }
    // etc.
}

答案 1 :(得分:2)

只需使用一个类。

public class Planet {
   public int Id { get; set; }
   public string Name { get; set; }
   public int Size { get; set; }
  // and so on for each property of whatever type you need.
}

当你需要一个新的星球时,新的:

var planet = new Planet();
planet.Name = "Saturn";
// again finish populating the properties.

将其添加到列表中:

var list = new List<Planet>();
list.Add(planet);
// adding the planet you created above.

然后使用LINQ

查看操作列表等