如何使用 C# 在 .Net 中设置特定对象类型列表的初始大小,并能够在指定索引处插入完全分配的对象?
问问题
30077 次
5 回答
15
有一个List<T>
构造函数将一个int
作为初始列表容量的参数,但它实际上并没有在列表中创建该数量的元素,所以这将抛出ArgumentOutOfRangeException
:
var items = new List<int>(10);
items[4] = 3;
您可以创建自己的方法来创建具有初始大小的那种List
:
private static List<T> CreateList<T>(int capacity)
{
return Enumerable.Repeat(default(T), capacity).ToList();
}
它会让它工作:
var items = CreateList<int>(10);
items[4] = 3;
但是 - 您为什么不直接使用Array
而不是List
在您知道所需容量时使用?
无 LINQ 版本
private static List<T> CreateList<T>(int capacity)
{
List<T> coll = new List<T>(capacity);
for(int i = 0; i < capacity; i++)
coll.Add(default(T));
return coll;
}
于 2013-04-05T21:03:12.013 回答
1
这可以通过数组轻松完成:
string[] sa = new string[99];
sa[71] = "g";
这也恰好实现了 IList 接口。
于 2013-04-05T21:14:19.010 回答
-1
声称插入失败的选民。
您是否阅读了链接中的文档?
如果 index 小于 0,则 ArgumentOutOfRangeException - 或 - index 大于 Count。
所以容量和计数是不一样的——不会使答案出错。
如果 index 小于 0 或 index 大于 Count,MarcinJuraszek 的答案将抛出 ArgumentOutOfRangeException。
我在生产应用程序中使用它来按字母顺序加载,然后在索引 0 处插入任何用户添加,它从未抛出异常。
于 2013-04-05T21:00:30.533 回答
-2
您可以使用构造函数重载List<T>(int capacity)
:
var l = new List<string>(42);
创建一个容量为 42 的列表。
于 2013-04-05T21:00:01.767 回答
-2
据我所知,与数组相比,将初始大小设置为列表违背了列表背后的整个想法。
但这里是你如何做到的:
List<ItemType> list = new List<ItemType>(size);
size 是 int 数据类型。
于 2013-04-05T21:03:41.673 回答