繁体   English   中英

C#索引超出数组范围

[英]C# Index out of bounds of array

我正在从文本文件中逐行阅读,我将从文本文件(10x10行)填充100个文本框,每行有10个逗号,文本文件中有10行,所以我试图从textfile中读取值。 但是,它显示索引超出范围,任何帮助?

string[] fileData = File.ReadAllLines(@"C:\Users\omgjyan\Desktop\OneOrganizer\OneOrganizer\WordPuzzle\educational.txt");

string[] lineValues;

int row = 0;
int col;

string[][] rowcol = new string[fileData.Length][];

foreach (string line in fileData)
{
    lineValues = line.Split(new string[] {","}, StringSplitOptions.RemoveEmptyEntries);
    rowcol[row] = new string[lineValues.Length];

    col = 0;

    foreach (string value in lineValues)
    {   
        rowcol[row][col] = value;                          
        col++;
    }

    row++;

}

for (int i = 0; i < rowcol.GetLength(0); i++)
{
    for (int j = 0; j < rowcol[i].GetLength(0); j++)
    {
        TextBox tbox = new TextBox();

        int iadd = i + 1;
        int iminus = i - 1;
        int jadd = i + 1;
        int jminus = i - 1;
        var self = rowcol[i][j];
        var top = rowcol[iminus][j];
        var bottom = rowcol[iadd][j];
        var left = rowcol[i][jminus];
        var right = rowcol[i][jadd];

        if ((!String.IsNullOrEmpty(self) && String.IsNullOrEmpty(top) && String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && !String.IsNullOrEmpty(left)) ||
                            (!String.IsNullOrEmpty(self) && !String.IsNullOrEmpty(top) && !String.IsNullOrEmpty(right) && String.IsNullOrEmpty(bottom) && !String.IsNullOrEmpty(left)) ||
                            (!String.IsNullOrEmpty(self) && !String.IsNullOrEmpty(top) && !String.IsNullOrEmpty(right) && String.IsNullOrEmpty(bottom) && String.IsNullOrEmpty(left)) ||
                            (!String.IsNullOrEmpty(self) && String.IsNullOrEmpty(top) && !String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && String.IsNullOrEmpty(left)) ||
                            (!String.IsNullOrEmpty(self) && !String.IsNullOrEmpty(top) && !String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && String.IsNullOrEmpty(left)) ||
                            (!String.IsNullOrEmpty(self) && !String.IsNullOrEmpty(top) && String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && !String.IsNullOrEmpty(left)) ||
                            (!String.IsNullOrEmpty(self) && String.IsNullOrEmpty(top) && !String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && !String.IsNullOrEmpty(left))
                        )
    {
        tbox.Text = "*";
    }

    wrapPanel1.Children.Add(tbox);
    }
}

我得到错误说索引超出范围。 可能是+1和-1吗? 我该如何解决这个问题

错误: 在此输入图像描述

你的代码有:

for (int i = 0; i < rowcol.GetLength(0); i++)
{
    for (int j = 0; j < rowcol[i].GetLength(0); j++)
    {
        int iadd = i + 1;
        int iminus = i - 1;
        int jadd = i + 1;
        int jminus = i - 1;

然后你试图访问数组

var self = rowcol[i][j];
var top = rowcol[iminus][j];
var bottom = rowcol[iadd][j];
var left = rowcol[i][jminus];
var right = rowcol[i][jadd];

这将在所有边缘情况下,因为iminus将是一个-1iadd将是rowcol.Length ,并且jminus / jadd 这些索引超出了数组的范围。 您可以通过简单地丢弃循环中的边缘情况来解决此问题:

for (int i = 1; i < rowcol.Length - 1; i++)
{
    for (int j = 1; j < rowcol[i].Length - 1; j++)
    {
        int iadd = i + 1;
        int iminus = i - 1;
        int jadd = i + 1;
        int jminus = i - 1;

这将确保您不访问数组边界之外的任何元素。 但仅凭这一点并不足以确保异常永远不会发生。 再看看这些线:

var top = rowcol[iminus][j];
var bottom = rowcol[iadd][j];

如果rowcol[iminus]rowcol[iadd]长度小于rowcol[i]则这将失败。 因此,您需要特别注意避免这种情况。 也许是这样的:

for (int i = 1; i < rowcol.Length - 1; i++)
{
    for (int j = 1; j < rowcol[i].Length - 1; j++)
    {
        int iadd = i + 1;
        int iminus = i - 1;
        int jadd = i + 1;
        int jminus = i - 1;
        if (j < rowcol[iminus].Length || j < rowcol[iadd].Length)
        {
            continue;
        }

你可以尝试这种方式的另一种方式是这样的:

for (int i = 0; i < rowcol.Length; i++)
{
    for (int j = 0; j < rowcol[i].Length; j++)
    {
        int iadd = i + 1;
        int iminus = i - 1;
        int jadd = i + 1;
        int jminus = i - 1;
        var self = rowcol[i][j];
        var top = iminus >= 0 && j < rowcol[iminus].Length ? rowcol[iminus][j] : string.Empty;
        var bottom = iadd < rowcol.Length && j < rowcol[iadd].Length ? rowcol[iadd][j] : string.Empty;
        var left = jminus >= 0 ? rowcol[i][jminus] : string.Empty;
        var right = jminus < rowcol[i].Length ? rowcol[i][jadd] : string.Empty;

当i和j为0时,i - 1和j - 1都是-1,当你尝试时会导致越界:

    int iadd = i + 1; 
    int iminus = i - 1;
    int jadd = i + 1;
    int jminus = i - 1;
    var self = rowcol[i][j]; 
    var top = rowcol[iminus][j]; //iminus is -1 first iteration!
    var bottom = rowcol[iadd][j];
    var left = rowcol[i][jminus]; //jminus is -1 first iteration!
    var right = rowcol[i][jadd];

您可以通过添加索引的检查来解决这个问题,实际上是在边界内(并跳过它们不是的迭代)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM