You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用List与for循环时出现索引越界问题求助

问题拆解与解决方案

哈哈,这个坑我刚入行的时候也踩过!咱们一步步把问题说透,再给你落地的解决办法~

一、先搞懂你遇到的两个报错根源

1. List直接赋值索引报错的原因

你说List是动态集合没错,但动态扩容≠可以直接给不存在的索引赋值。刚用new List<string>()创建的List是空的,Count属性是0——也就是说它连索引0的元素都没有,你直接写questions[i] = ...,自然会抛出ArgumentOutOfRangeException。

你不想用.Add()是怕重复添加?其实完全可以先清空旧数据再Add,这就实现了覆盖旧题目的需求。

2. 数组赋值报错的原因

你写的public static int[] answers {};其实是创建了一个长度为0的空数组。数组的长度是固定的,一旦创建就没法修改——空数组里连一个元素位置都没有,你给任何索引赋值都会触发IndexOutOfRangeException。要想用数组,必须先创建对应题目数量的数组才行。

二、满足「覆盖旧题目」需求的两种正确实现

方案1:用List(推荐,灵活性更高)

先清空旧数据,再循环添加新题目,逻辑最直观:

// 先清空旧的题目和答案,确保是全新的内容
Data.Questions.Sum.questions.Clear();
Data.Questions.Sum.answers.Clear();

int targetCount = 10; // 你设定的题目数量
string[] sentencePatterns = { "{0}加{1}等于多少?", "计算{0}+{1}的结果:" }; // 预设句式
Random random = new Random();

for (int i = 0; i < targetCount; i++)
{
    // 生成随机数字与答案
    int num1 = random.Next(1, 100);
    int num2 = random.Next(1, 100);
    int answer = num1 + num2;
    
    // 随机选句式并格式化题目
    string selectedPattern = sentencePatterns[random.Next(sentencePatterns.Length)];
    string question = string.Format(selectedPattern, num1, num2);
    
    // 添加新数据(因为之前清空了,所以相当于覆盖旧内容)
    Data.Questions.Sum.questions.Add(question);
    Data.Questions.Sum.answers.Add(answer);
}

如果真的不想用.Add(),可以先初始化List的元素数量再赋值索引(虽然没必要,但满足你的需求):

int targetCount = 10;
// 直接创建对应长度的List,空元素会被填充默认值(string是null,int是0)
Data.Questions.Sum.questions = new List<string>(new string[targetCount]);
Data.Questions.Sum.answers = new List<int>(new int[targetCount]);

Random random = new Random();
for (int i = 0; i < targetCount; i++)
{
    int num1 = random.Next(1, 100);
    int num2 = random.Next(1, 100);
    int answer = num1 + num2;
    
    string selectedPattern = sentencePatterns[random.Next(sentencePatterns.Length)];
    string question = string.Format(selectedPattern, num1, num2);
    
    // 现在可以直接赋值索引了,因为List里已经有targetCount个元素位置
    Data.Questions.Sum.questions[i] = question;
    Data.Questions.Sum.answers[i] = answer;
}

方案2:用数组

必须先创建对应长度的数组,再循环赋值:

int targetCount = 10;
// 重新创建对应长度的数组,直接覆盖旧的数组引用
Data.Questions.Sum.questions = new string[targetCount];
Data.Questions.Sum.answers = new int[targetCount];

Random random = new Random();
for (int i = 0; i < targetCount; i++)
{
    int num1 = random.Next(1, 100);
    int num2 = random.Next(1, 100);
    int answer = num1 + num2;
    
    string selectedPattern = sentencePatterns[random.Next(sentencePatterns.Length)];
    string question = string.Format(selectedPattern, num1, num2);
    
    Data.Questions.Sum.questions[i] = question;
    Data.Questions.Sum.answers[i] = answer;
}

三、总结一下核心要点

  • List的索引赋值要求该索引对应的元素已经存在(也就是List.Count > i),空List直接赋值索引必然报错;
  • 数组必须在创建时指定长度,空数组没有任何元素位置,赋值索引肯定越界;
  • 要实现「覆盖旧题目」,List用Clear()+Add()最直观,数组则直接重新创建对应长度的数组即可。

内容的提问来源于stack exchange,提问作者siroot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:21:39