1

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

现在......我需要为一个太阳系填充值,该太阳系中的每个物体可能有大约 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>()

ETC...

我的问题是从所有这些字典中检索值的最佳方法是什么?每个字典中每个“主体”的键都是相同的。我知道我可以通过很多循环来做到这一点,但这似乎对 CPU 周期非常浪费,这对我来说是一件坏事。

我也考虑过 Dictionary,List 但还有其他我不太喜欢的问题。

4

2 回答 2

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.
}
于 2013-05-22T23:07:38.883 回答
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 操作列表等

于 2013-05-22T23:10:26.230 回答