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

3

我的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循环遍历每个项目(Acura,BMW,Buick ... Volvo),然后因某种原因继续进行。它不会停止。
为了测试代码,我创建了一个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(跳过),就会抛出错误。
我不确定是否正确初始化了我的列表。我看到有人说必须对新列表执行.add,但我想既然我使用Linq .ToList()创建我的列表,它应该能正常工作。
内部错误显示为空。以下是错误的大部分详细信息的图片。

enter image description here


错误发生在foreach循环的那一行。该行代码是:foreach(var carModel in modelList),或者在for循环中,代码为:for(var y = 0; y < modelCount; y++)。 - Millar248
你确定你的代码和dll文件同步了吗? - TGlatzer
我不确定我的代码和 DLL 是否同步。我已经尝试过清理和重新构建。我现在将尝试保存、关闭、关闭 Visual Studio,并重新启动一切。 - Millar248
1
如果您在分配Linq后检查modelList的内容,它的值是什么?它是否在最后一个值之后终止?计数是多少? - DiscipleMichael
在这行代码之后:var modelList = splitString.Where(str => !string.Equals(str, dynamicOwnershipChoiceQuestion.Brand, StringComparison.CurrentCultureIgnoreCase)).ToList();ModelList.Count = 43。 Values = (0 - 42) Acura,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。 - Millar248
显示剩余9条评论
1个回答

0

你确定所有引用中的 ddcount 变量都是正确的吗?例如,当你初始化变量时它是小写字母 C 的 ddcount,但当你后来引用变量时,它是大写字母 C 的 ddCount。我建议先纠正这个问题。

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++;
    }
}

此外,我建议您检查在“//some html section”中编写HTML的方式,如果是纯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"

请确保它不会返回任何奇怪的东西。

希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接