索引超出了for循环C#中数组的范围

时间:2015-10-13 02:38:14

标签: c#

所以我现在已经开始使用控制台游戏了一段时间,我决定使用.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]);
        }
    }

我收到此错误:索引超出了数组的范围。我无法确定原因。有人可以帮忙吗?感谢

3 个答案:

答案 0 :(得分:3)

检查变量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]);
    }
}

答案 1 :(得分:0)

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

首先,我在您提供的代码中注意到了一些事项。

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

您已在此处提取了文本文件,并使用逗号分隔符拆分_org。虽然您实际上从未将split数组分配给变量。 _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;
    }

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

然后,您继续为mapwidth的每两个增量i添加一个

在最后一个块中,您要将_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# Programmer's Reference

答案 2 :(得分:-1)

尝试此链接。

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

使用建议关键字来避免索引超出数组范围

示例代码。

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