问题
我在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#中执行相同的操作吗?
感谢您的帮助。
答案 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]
访问第一个索引处的对象