无法调用Random相关方法,List未写入且出现索引越界问题求助
问题分析与修复
问题现象
尝试创建List<int>并根据种子值随机排序,但目标列表始终无内容写入,调用List.ElementAt时抛出错误:
索引超出范围。必须是非负数且小于集合大小。参数名: index
断点显示TimeskipOrder列表从未被正确赋值。
代码片段
主文件代码
public static List<int> TimeskipOrder = new(17); public static int Seed = 12345; public static void Shuffle<T>(List<T> list, int seed) { Seed = seed; var rng = new Random(seed); int n = list.Count; while (n > 1) { n--; int k = rng.Next(n + 1); T value = list[k]; list[k] = list[n]; list[n] = value; } } public static void Randomize() { var numbers = new List<int>(Enumerable.Range(1, 17)); Shuffle(numbers, Seed); TimeskipOrder.Clear(); numbers.AddRange(TimeskipOrder); }
窗体按钮点击代码
public void button2_Click(object sender, EventArgs e) { TimeSkip.Randomize(); }
问题根源
Randomize方法最后一行逻辑完全颠倒:
- 当前代码执行的是
numbers.AddRange(TimeskipOrder),这是把**清空后的空列表TimeskipOrder**添加到临时列表numbers中,目标列表TimeskipOrder始终保持为空。 - 正确逻辑应该是将打乱后的
numbers内容写入TimeskipOrder。
修复代码
修改Randomize方法的最后一行:
public static void Randomize() { var numbers = new List<int>(Enumerable.Range(1, 17)); Shuffle(numbers, Seed); TimeskipOrder.Clear(); // 将打乱后的结果写入目标列表 TimeskipOrder.AddRange(numbers); }
额外说明
- 修复后,点击按钮调用
Randomize时,TimeskipOrder会被正确填充1-17的随机排序值,后续调用ElementAt不会再出现索引越界问题。 Shuffle方法采用的Fisher-Yates洗牌算法逻辑正确,无需修改。
内容的提问来源于stack exchange,提问作者pokisal
相关产品推荐
相关产品推荐

