2015-12-23 28 views
6

我有一個空列表定義爲包含120個值,我想在索引(45)處插入一個元素,即使列表當前爲空。這可能嗎?如何在自定義索引中的列表中插入對象

public List<Ticket> Tickets = new List<Ticket>(120); 

Tickets.Insert(45,ticket); // Here I am getting the ArgumentOutOfRangeException 
+0

你試圖解決什麼樣的問題?爲什麼你想在一個空列表中的特定「索引」處插入一個項目?爲什麼不用字典?解決原始問題比試圖改變List

+0

的行爲更容易解決使用「Dictionary 」或自定義容器等其他數據結構的更好的解決方案嗎? –

回答

12

您將列表的初始內部容量設置爲120.列表仍爲空。

List<T>可以容納任意數量的物品。在內部,它使用數組來存儲它們。如果數組滿了,列表將分配一個新的更大的列表。如果您事先知道項目的數量,則可以在構建列表時設置內部數組的大小。這樣可以避免不必要的內存分配。

你可以使用一個數組:

Ticket[] tickets = new Ticket[120]; 
tickets[45] = ticket 

Dictionary<int, Ticket>

Dictionary<int, Ticket> tickets = new Dictionary<int, Ticket>(); 
tickets.Add(45, ticket); 

,或者創建一個List<Ticket>持有120個空:

List<Ticket> tickets = Enumerable.Repeat(default(Ticket), 120).ToList(); 
8

120定義爲列表capacity - 而不是真實存在的元素。所以在這種情況下,你的列表在插入時包含0個元素。

當您嘗試在位置45元插入一個空的列表 - 一個ArgumentOutOfRangeException有道理

+0

是的,我很清楚這一點,所以我的問題是有什麼辦法做到這一點,我想要的?將元素添加到指定的索引? –

+0

如何在事先沒有任何元素的情況下添加它們?沒有意義。@ NaughtyNinja – Haris

+0

做什麼?插入第一個項目時沒有索引位置45。這隻會在你用120個「默認」票據填充清單時才存在。你正試圖踩一個可變長度的集合,就像它是一個數組或字典(提示) –

4

你應該填充一些列表,因爲這個構造函數列表的犯規來填充它。

public List<Ticket> Tickets = new List<Ticket>(Enumerable.Repeat (new Ticket(), 120)); 

Tickets[45] = ticket; 
+3

我有一種感覺,作爲這個用例的數據結構,數組可能更明智。 – SBI

5

您可以使用字典也

var dic = new Dictionary<int,Ticket>(); 
dic[45] = ticket; 
0
Dictionary<int, Ticket> Tickets = new Dictionary<int,Ticket>; 
    Tickets.Add(45, tickets); 

它是否需要成爲一個列表,並確定順序?如果不是爲什麼不使用字典或其他鍵/值對象?

3

您還可以通過創建數組,其默認初始化所有的元素列表:

List<Ticket> tickets = new Ticket[120].ToList(); 
tickets[45] = ticket; 
4

接受一個int是有定義的初始容量,而不是元素的初始數量的構造。

當您嘗試將元素添加以下代碼運行列表:

private void EnsureCapacity(int min) 
{ 
    if (this._items.Length >= min) 
    return; 
    int num = this._items.Length == 0 ? 4 : this._items.Length * 2; 
    if ((uint) num > 2146435071U) 
    num = 2146435071; 
    if (num < min) 
    num = min; 
    this.Capacity = num; 
} 

關鍵的一點是,它試圖容量每次運行的空間時間加倍。這個結果是每個加倍的數組副本。當您知道列表的大小時,爲了避免計算成本的增加,從設置初始容量開始。

相關問題