-2

如何使用 C# 在 .Net 中设置特定对象类型列表的初始大小,并能够在指定索引处插入完全分配的对象?

4

5 回答 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

列表构造函数 (Int32)

List.Insert 方法

声称插入失败的选民。
您是否阅读了链接中的文档?
如果 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 回答