2015-12-23 24 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; 
} 

关键的一点是,它试图容量每次运行的空间时间加倍。这个结果是每个加倍的数组副本。当您知道列表的大小时,为了避免计算成本的增加,从设置初始容量开始。

相关问题