2013-04-24 112 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