首页 文章

为什么我的foreach循环抛出索引超出范围错误?

提问于
浏览
2

我的foreach循环抛出索引超出范围错误 . 我有一个字符串列表,以及一个遍历它的foreach循环 . 这是我初始化列表的代码,以及抛出错误的foreach循环 .

const string modelString = "Acura,Audi,BMW,Buick,Cadillac,Chevrolet,Chrysler,Dodge,Ferrari,Ford,GM,GEM,GMC,Honda,Hummer,Hyundai,Infiniti,Isuzu,Jaguar,Jeep,Kia,Lamborghini,Land Rover,Lexus,Lincoln,Lotus,Mazda,Mercedes-Benz,Mercury,Mini,Mitsubishi,Nissan,Oldsmobile,Peugeot,Pontiac,Porsche,Regal,Saab,Saturn,Subaru,Suzuki,Toyota,Volkswagen,Volvo";
var splitString = modelString.Split(',');
var modelList = splitString.Where(str => !string.Equals(str, dynamicOwnershipChoiceQuestion.Brand, StringComparison.CurrentCultureIgnoreCase)).ToList();
//dynamicOwnershipChoiceQuestion.Brand = "Audi"
for (var i = 6; i <= 10; i++)
{
    var ddcount = 1;
    //some html
    @foreach (var carModel in modelList){
        <option id="dd-@i-@ddCount">@carModel</option>
        ddCount++;
    }
}

foreach循环遍历每个项目(讴歌,宝马,别克......沃尔沃),然后由于某种原因继续前进 . 它不会停止 .

为了测试代码,我创建了一个for循环而不是foreach循环 . 更改如下所示:

var ddcount = 1; //changes after this
var modelCount = modelList.Count;
//some html
@for (var y = 0; y < modelCount; y++)
{
    <option id="dd-@i-@ddCount">@modelList[y]</option>
    ddCount++;
}

当我运行此代码时,在循环完成循环后,我得到相同的索引超出范围错误 . modelCount = 43.循环运行43次,然后y命中43,条件设置为false,然后循环继续运行 . ddcount达到44(这是有意义的,因为它从1开始,并添加43) . 在ddcount命中44之后,调试器返回到for循环并且y设置为43.然后我点击下一步,并将鼠标悬停在y <modelCount上,两者都读为43.然后我点击f10(跳过)并且错误被抛出 .

我不确定我是否错误地启动了我的列表 . 我看到了我必须做的某个地方 . 添加到新列表,但我想,因为我使用Linq .ToList()创建我的列表,它将正常工作 .

内部错误表明它是空的 . 这是错误的大部分细节的图片 .

enter image description here

1 回答

  • 0

    你确定ddcount变量在所有引用中都是正确的吗?例如,当你初始化变量时,它是ddcount,小写C,但是当你稍后引用变量时,它是ddCount,大写C.我会先纠正它 .

    const string modelString = "Acura,Audi,BMW,Buick,Cadillac,Chevrolet,Chrysler,Dodge,Ferrari,Ford,GM,GEM,GMC,Honda,Hummer,Hyundai,Infiniti,Isuzu,Jaguar,Jeep,Kia,Lamborghini,Land Rover,Lexus,Lincoln,Lotus,Mazda,Mercedes-Benz,Mercury,Mini,Mitsubishi,Nissan,Oldsmobile,Peugeot,Pontiac,Porsche,Regal,Saab,Saturn,Subaru,Suzuki,Toyota,Volkswagen,Volvo";
    var splitString = modelString.Split(',');
    var modelList = splitString.Where(str => !string.Equals(str, dynamicOwnershipChoiceQuestion.Brand, StringComparison.CurrentCultureIgnoreCase)).ToList();
    //dynamicOwnershipChoiceQuestion.Brand = "Audi"
    for (var i = 6; i <= 10; i++)
    {
        var ddcount = 1;
        //some html
        @foreach (var carModel in modelList){
            <option id="dd-@i-@ddcount">@carModel</option>
            ddcount++;
        }
    }
    

    另外,我会检查你如何在某个html部分编写htmls,如果它是纯HTML,那么@foreach不应该以@开头 .

    以第二段代码为例,

    @{
        const string modelString = "Acura,Audi,BMW,Buick,Cadillac,Chevrolet,Chrysler,Dodge,Ferrari,Ford,GM,GEM,GMC,Honda,Hummer,Hyundai,Infiniti,Isuzu,Jaguar,Jeep,Kia,Lamborghini,Land Rover,Lexus,Lincoln,Lotus,Mazda,Mercedes-Benz,Mercury,Mini,Mitsubishi,Nissan,Oldsmobile,Peugeot,Pontiac,Porsche,Regal,Saab,Saturn,Subaru,Suzuki,Toyota,Volkswagen,Volvo";
        var splitString = modelString.Split(',');
        var modelList = splitString.Where(str => !string.Equals(str, "Audi", StringComparison.CurrentCultureIgnoreCase)).ToList();
        //dynamicOwnershipChoiceQuestion.Brand = "Audi"
    
        for (var i = 6; i <= 10; i++)
        {
            var ddcount = 1; //changes after this
            var modelCount = modelList.Count;
            //some html
            <div>Car brands @i</div>
            for (var y = 0; y < modelCount; y++)
            {
                <option id="dd-@i-@ddcount">@modelList[y]</option>
                ddcount++;
            }
          }
    }
    

    最后,我会坚持这一点

    dynamicOwnershipChoiceQuestion.Brand = "Audi"
    

    确保它没有返回任何奇怪的东西 .

    希望这可以帮助

相关问题