2013-04-24 109 views
1

我有一个List<T>,并希望开始从底部添加,但我得到一个运行时IndexOutOfBoundsExceptionC#列表 - 添加到列表底部

我已经初始化列表的容量:

List<ClassA> ClassesOfA = new List<ClassA>(10); 
... 
... 
ClassesOfA[5] = classAObj; 
... 

反正有没有做到这一点?

我需要这样做,因为我从底部分析另一个列表并将结果添加到此列表中。所以我需要能够从底部添加。 有没有办法做到这一点,而不是在添加我的对象之前初始化List<ClassA>ClassA对象?

+2

也许它是'堆栈'你正在寻找的 – I4V 2013-04-24 14:43:43

+1

为什么不分析顶部而不是底部的其他列表。职位是相对的。 – Richard 2013-04-24 14:44:32

+3

默认容量不会预先使用项目填充列表。它只是设置列表的当前内存块以保存调整大小,如果你碰巧知道列表大小或良好的初始大小。 – 2013-04-24 14:46:32

回答

2

你可以尝试添加像这样的元素:ClassesOfA.Add(classAObj),那么当添加所有列表元素时,可以调用ClassesOfA.Reverse()来颠倒列表中对象的顺序。

+1

更好的选择是将项目添加到新列表时,按相反顺序遍历原始列表。这会将呼叫保存到反向。 – 2013-04-24 14:52:11

+1

@JustinNiessner请注意,如果你使用LINQ'Reverse'而不是'List.Reverse',那么它就可以做到这一点,所以你需要做的就是'list.AsEnumerable()。Reverse()'。 – Servy 2013-04-24 14:55:30

+0

@macrosoaie谢谢。我没有想到相反的方法。这可以为我工作。 – madu 2013-04-24 15:05:26

7

要将项目添加到列表中,您应该拨打ClassesOfA.Add()。任何以这种方式添加的项目都将被添加到列表的末尾(不确定列表的开头或列表的末尾是否是您认为的底部)。

+1

尽管这是正确的,但我相信OP在容量构造函数过载的问题上感到困惑。 – 2013-04-24 14:48:32

1

如果你的第二个名单将有相同数量的比您正在处理第一个列表中的元素,我想你想使用的仅仅是一个数组一样:

var myArray = new ClassA[listA.Count]; 
for (int i = 0; i < listA.Count; ++i) myArray[i] = Process(listA[i]); 
+0

基督..你没有看到'新名单(otherIEnumerableOfX)'?或'otherListOfX.ToArray()'方法? – quetzalcoatl 2013-04-24 14:51:12

+0

这与什么有关?当然,你可以用很多不同的方法来做到这一点,你也可以像使用var myArray = listA.Select(Process).ToArray一样使用linq,但是我可以使用 – 2013-04-24 14:52:59

+0

negscore:我没有注意到Process()调用,它至少有一定意义。如果我注意到它,我会建议选择:)少字符=少写=少错误。少字=少阅读=简单的保养。只是。 – quetzalcoatl 2013-04-24 14:57:06

1

另外,优选的,维持两个列表,并在年底将它们连接起来:

var firstList = new List<ClassA>(); 
var secondList = new List<ClassA>(); 

// Fill the lists. 

return firstList.Concat(secondList).ToList(); // using System.Linq; 


但是,如果你真的想要去的路线,你所提出的建议:

您需要

var list = new List<ClassA>(10); 
list.AddRange(new ClassA[5]); 

// Or... 
var list = Enumerable.Repeat<ClassA>(null, 5).ToList(); 

现在你可以继续:当你需要为了“储备”的空间添加尽可能多的空项来自索引5的项目:

list.Add(new ClassA()); 

容量不会预先填充许多项目的列表。如果你想让第一个5空了,这是最好的,因为我可以看到你会得到。

从这一点开始,添加将项目添加到列表的底部。我不完全确定你为什么要这样做。

+0

为什么要创建一个只包含1024个空值的1024个元素的数组? :)但是,我承认,这很简单。仍然。我会用Enumerable .Repeat(5) – quetzalcoatl 2013-04-24 14:53:10

+0

@quetzalcoatl那么,它的5开始。我只是使用数组语法,因为数组会默认每个元素,这似乎是需要的。 – 2013-04-24 14:54:14

+0

我有一个基于IRC的特征,并按'输入'通常是一句话太快。同时你写了你的,我已经完成了评论。当然,拼写错误到处都是,所以它应该是Enumerable.Repeat(x,5),但我认为这很清楚..我想指出,使用手动量身定制的容量仅仅是为了消除小时间/内存的好处是非常不合理的通过创建一次性数组:)或者你在乎,或者你没有。如果你不把容量留在外面,让它适应。如果你在乎:那么**照顾**。这是次要的,但是这是逻辑的混乱,以后会误导某人。 – quetzalcoatl 2013-04-24 15:04:40