我有一个空列表定义为包含120个值,我想在索引(45)处插入一个元素,即使列表当前为空。这可能吗?如何在自定义索引中的列表中插入对象
public List<Ticket> Tickets = new List<Ticket>(120);
Tickets.Insert(45,ticket); // Here I am getting the ArgumentOutOfRangeException
我有一个空列表定义为包含120个值,我想在索引(45)处插入一个元素,即使列表当前为空。这可能吗?如何在自定义索引中的列表中插入对象
public List<Ticket> Tickets = new List<Ticket>(120);
Tickets.Insert(45,ticket); // Here I am getting the ArgumentOutOfRangeException
您将列表的初始内部容量设置为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();
你应该填充一些列表,因为这个构造函数列表的犯规来填充它。
public List<Ticket> Tickets = new List<Ticket>(Enumerable.Repeat (new Ticket(), 120));
Tickets[45] = ticket;
我有一种感觉,作为这个用例的数据结构,数组可能更明智。 – SBI
您可以使用字典也
var dic = new Dictionary<int,Ticket>();
dic[45] = ticket;
Dictionary<int, Ticket> Tickets = new Dictionary<int,Ticket>;
Tickets.Add(45, tickets);
它是否需要成为一个列表,并确定顺序?如果不是为什么不使用字典或其他键/值对象?
您还可以通过创建数组,其默认初始化所有的元素列表:
List<Ticket> tickets = new Ticket[120].ToList();
tickets[45] = ticket;
接受一个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;
}
关键的一点是,它试图容量每次运行的空间时间加倍。这个结果是每个加倍的数组副本。当您知道列表的大小时,为了避免计算成本的增加,从设置初始容量开始。
你试图解决什么样的问题?为什么你想在一个空列表中的特定“索引”处插入一个项目?为什么不用字典?解决原始问题比试图改变List –
的行为更容易解决使用“Dictionary”或自定义容器等其他数据结构的更好的解决方案吗? –