C#索引超出数组的界限

C#索引超出数组的界限,c#,asp.net,for-loop,foreach,jagged-arrays,C#,Asp.net,For Loop,Foreach,Jagged Arrays,我从一个文本文件中逐行读取,我将从文本文件中填充100个文本框(10x10行)。每行中有10个逗号,文本文件中有10行,因此我尝试从文本文件中读取值。但不管它如何显示索引是不允许的,有什么帮助吗 string[] fileData = File.ReadAllLines(@"C:\Users\omgjyan\Desktop\OneOrganizer\OneOrganizer\WordPuzzle\educational.txt"); string[] lineValues; int row

我从一个文本文件中逐行读取,我将从文本文件中填充100个文本框(10x10行)。每行中有10个逗号,文本文件中有10行,因此我尝试从文本文件中读取值。但不管它如何显示索引是不允许的,有什么帮助吗

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);
    }
}
string[]fileData=File.ReadAllLines(@“C:\Users\omgjyan\Desktop\OneOrganizer\OneOrganizer\WordPuzzle\education.txt”);
字符串[]行值;
int行=0;
int col;
string[][]rowcol=新字符串[fileData.Length][];
foreach(fileData中的字符串行)
{
lineValues=line.Split(新字符串[]{,“},StringSplitOptions.RemoveEmptyEntries);
rowcol[row]=新字符串[lineValues.Length];
col=0;
foreach(lineValues中的字符串值)
{   
rowcol[row][col]=值;
col++;
}
行++;
}
for(int i=0;i
我得到的错误是索引超出了范围。会是+1和-1吗?我该如何解决这个问题


错误:

当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];
您可以通过添加检查来解决这个问题,检查索引是否在边界内(并跳过没有边界的迭代)。

您的代码有:

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;
由于
iminus
将是一个
-1
iadd
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;
如果
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;
for(int i=1;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;
for(int i=0;i=0&&j=0?rowcol[i][jminus]:string.Empty;
var right=jminus
哪一行代码出现异常?如果i==0 return,我会这样做,否则var bottom,这样也可以吗?@user2376998
return
将立即退出整个方法。我认为这不是您想要的。@user2376998在哪一行?如果您按照我指定的代码使用,您将不会看到更多的
indexoutboundsexception
's.@user2376998好的,但这仍然没有告诉我它是在哪一行抛出的