簡體   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