包含Dictionary Containing List的列表

时间:2012-03-08 12:36:52

标签: c# list data-structures dictionary

问题

我在C#中需要一个像上面这样的数据结构,但是我在访问内容时遇到了问题,我看到我可以用C ++做到这一点在c#中是如何完成的?

List<Dictionary<string, List<int>>> data = 
new List<Dictionary<string, List<int>>>(5);

当我执行Data [0]时,我收到错误,指出索引超出界限..

任何人都可以指出我如何做到这一点。或者我做错了什么?

附录:

- &gt; 我想做什么

我基本上是在创建一个保存月份计划的数据结构。 所以每个包含5周的清单包含&gt; 活动词典,其中每个活动的价值是 - &gt; 7个整数的列表,表示每周每天花在该活动上的小时数。

我有我需要添加空白条目。 附加问题是这样的。

- &GT; 查询

现在我必须在列表中添加5个空白词典。 以及表示每天消耗时间的字典的每个键中的7个整数(初始化为零)的列表。

有没有办法初始化列表中的5个空白词典,内部相同,而无需手动创建新词典并添加它们。 使用c ++我相信你可以做到这一点甚至输入你想要初始化每个条目的值,所以..

这样的陈述
Vector<int> *vec = new Vector<int>(5,0);

初始化vec有5个条目,每个条目为0.我可以在c#中执行相同的操作吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:11)

这与列表是复杂类型无关。你会得到同样的东西:

List<string> list = new List<string>(5);
string x = list[0]; // This will fail too

List<T>(int)构造函数创建一个具有给定容量的列表(即支持它的数组的初始大小为5,假设它没有确定它太小而不能有用)。它的大小仍为0。

您仍然需要先将元素添加到列表中,然后才能访问它们。

编辑:没有构造函数来“填充”具有给定值集的列表。使用LINQ,你可以写:

List<string> list = Enumerable.Repeat("foo", 5).ToList();

...但你不会想要为你的字典做一次,否则你最终会得到5个对同一字典的引用。你可以使用:

var list = Enumerable.Range(0, 5)
                     .Select(x => new Dictionary<string, List<int>>())
                     .ToList();

请注意,这里的每个词典都是空的。

我个人可能只是创建列表并用for循环填充它...

答案 1 :(得分:2)

您已使用默认大小5初始化List,但列表仍为空,因此当您尝试访问数据对象中的索引0时,它超出范围,因为列表中的当前项目数量为0,因此没有对象可供访问。

如果向数据添加新项目,使用data.Add(...),您可以使用data [0]

访问第一个索引处的对象