c#中字典的用法

本文关键字:用法 字典 | 更新日期: 2023-09-27 18:14:50

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

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

等等……

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

我也考虑过Dictionary,List,但它有其他问题我不是特别喜欢。

c#中字典的用法

创建一个复合类型,并使用它

坚持使用字典是合适的如果键是唯一标识符 -行星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 { .. }); 

(我很少选择数组而不是列表-有时更好,但不经常。)


复合类型(即类)用于将不同的属性分组到一个更大的概念或分类组中:

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

只需使用一个类即可。

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

操作列表等等