c# for循环中的Index超出了数组的边界

本文关键字:数组 边界 Index for 循环 | 更新日期: 2023-09-27 18:17:17

我已经制作了一款主机游戏一段时间了,我决定使用。txt文件来保存地图。以下代码打开并存储txt文件内容:

        static void LoadMap(string fname)
    {
        string _org = File.ReadAllText("Maps/" + fname + ".txt");
        _org.Split(',');
        string[] _tmp = new string[_org.Length];
        for (int i=0;i<_org.Length;i++)
        {
            _tmp[i] = _org[i].ToString();
        }
        //This line has the error
        for (int i=0;_tmp[i]!="$";i+=2)
        {
            mapwidth += 1;
        }
        for (int i=0;i<_tmp.Length;i++)
        {
            leveldata.Add(_tmp[i]);
        }
    }

我得到这个错误:索引超出了数组的边界。我不知道为什么。有人能帮忙吗?由于

c# for循环中的Index超出了数组的边界

检查变量i的取值不能超过数组的Length - 1

static void LoadMap(string fname)
{
    string _org = File.ReadAllText("Maps/" + fname + ".txt");
    _org.Split(',');
    string[] _tmp = new string[_org.Length];
    for (int i = 0;i < _org.Length; i++)
    {
        _tmp[i] = _org[i].ToString();
    }
    for (int i = 0;i < _tmp.Length && _tmp[i] != "$"; i += 2)
    {
        mapwidth += 1;
    }
    for (int i = 0;i < _tmp.Length; i++)
    {
        leveldata.Add(_tmp[i]);
    }
}

我不太确定你在这里得到什么,但我觉得foreach可能是朝着正确方向迈出的一步。

首先,我在您提供的代码中注意到以下几点:

    string _org = File.ReadAllText("Maps/" + fname + ".txt");
    _org.Split(',');

在这里,您已经摄取了文本文件并使用逗号分隔符分割_org。尽管您从未实际将拆分数组赋值给变量。_org仍然是string,而不是string[]

    string[] _tmp = new string[_org.Length];
    for (int i = 0; i < _org.Length; i++)
    {
        _tmp[i] = _org[i].ToString();
    }

在此块中,我们将_tmp设置为使用_org长度的字符串数组。本例中的Length属性将检索字符串_org中的字符数。假设将_org设置为"foo",则_tmp数组的大小现在为3。(0, 1, 2)

然后加载_tmp,并将_org的第n个字符转换为字符串。

此时,我们的变量中有以下内容:

_org = "foo"
_tmp = {"f","o","o"}

接下来的部分让我有点措手不及,因为我不能确定你想要完成什么。

    for (int i = 0; _tmp[i] != "$"; i += 2)
    {
        mapwidth += 1;
    }

_tmp[i]等于"$"之前,您一直处于for循环中,并且每次使用i += 2通过循环时,您都会将2添加到i。这个逻辑将打破循环,直到它遇到一个"$",或者如果i超出数组的边界,它将抛出一个异常。

然后,每增加两次i,就给mapwidth加1

在最后一个代码块中,您将_tmp数组的内容添加到leveldata

    for (int i = 0; i < _tmp.Length; i++)
    {
        leveldata.Add(_tmp[i]);
    }

现在是好东西,foreach。我假设您想将_org设置为一个数组,并且您想要所有不是"$"的内容。记住,这应该完成你想要的,尽管我不确定在第二个for循环中增加2的目的,所以我现在把它省略了。

static void LoadMap(string fname)
{
    string[] _org = File.ReadAllText("Maps/" + fname + ".txt").Split(',');
    foreach (var _tmp in _org)
    {
        if (_tmp != "$")
        {
            mapwidth += 1;
        }
        leveldata.Add(_tmp);
    }
}

如果你想继续编码,那么掌握基础知识总是一个好主意。

虽然有点过时,这里是一个很好的教程由微软c#编程基础:c#程序员参考资料

试试这个链接。

https://www.programiz.com/csharp-programming/foreach-loop

有建议关键字,以避免索引超出数组的边界错误。

示例代码。

for(int i = 0; i < myArray.Length; i++)
   {
        // Coding to Array for loop.
   }