我有这个代码:
List<string> list = new List<string>(30);
list.Insert(1, "string 1");
list.Insert(10, "string 10");
list.Insert(5, "string 5");
运行时在 sting 10 上崩溃,异常索引必须在列表的范围内
我无法理解的是我已经定义了一个包含 30 个项目的列表,那么为什么会崩溃,如果我不能以这种方式添加项目,定义 30 的意义何在?
初始化时列表仍为空。参数 '30' 意味着它将仅具有 30 个项目的容量。
如果您坚持使用列表而不是数组,则必须先添加 30 个项目,然后才能将它们设置为适当的索引。
最简单的方法是:
List<string> list = new string[30].ToList();
list[1] = "string 1";
list[10] = "string 10";
list[5] = "string 5";
还要注意,当你在使用的时候Insert
,它基本上会把Add
item放到某个index,所以list中的item数量会增加。
这一行:
List<string> list = new List<string>(30);
将 初始化为 30 个项目list
的容量。它不会创建 30 个项目。
此时列表为空。您需要先添加30 个项目,然后可以Insert
随机添加,尽管您可以将这些项目按随机顺序排序,如ivowiblo的答案中所述。
请参阅Yorye Nathan的答案,了解使用 30 项初始化列表的方法(使用 LINQ)。
看看这里。如您所见,插入方法使用列表的计数变量而不是容量。这意味着您可以在不超过列表当前计数的位置插入元素,这是元素的有效数量。
您为 30 个元素保留了内存,但实际上您的列表在第一次 insert 之前是空的,因此,在插入一个元素后,列表中没有位置 10。
这可以解决问题:
List<string> list = new List<string>();
list.Add("string 1");
list.Add("string 10");
list.Add("string 5");
var randomOrder = list.OrderBy(x => Guid.NewGuid());