【问题标题】:Why does my foreach loop throw an index out of range error?为什么我的 foreach 循环会抛出索引超出范围错误?
【发布时间】:2016-04-23 22:04:01
【问题描述】:

我的 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、别克...沃尔沃),然后出于某种原因继续运行。它不会停止。

为了测试代码,我创建了一个 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

我不确定我是否错误地启动了我的列表。我在某个地方看到了我必须做的 .add 到新列表,但我认为既然我使用 Linq .ToList() 创建了我的列表,它会正常工作。

内部错误说它是空的。这是错误的大部分细节的图片。

【问题讨论】:

  • 错误实际发生在哪一行?我无法发现您的 for 循环有问题,所以我想知道它是否发生在循环后的第一行?
  • foreach循环的那一行出现错误。这一行:foreach (var carModel in modelList) 或者在for循环中:for (var y = 0; y
  • 你确定你的代码和你的 dll 是同步的吗?
  • 我不确定我的代码和 dll 是否同步。我尝试过清洁和重建。我目前将尝试保存、关闭、关闭 Visual Studio 并重新启动所有内容。
  • 如果在分配 Linq 后检查 modelList 的内容,它的值是多少?它会在最后一个值之后终止吗?数是多少?

标签: c# razor foreach


【解决方案1】:

您确定 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++;
    }
}

另外,我会检查你如何在 //some html 部分中编写 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"

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

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-22
    • 2015-09-12
    • 2017-12-02
    • 2019-04-25
    • 2013-03-09
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多