[英]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
將是一個-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;
這將確保您不訪問數組邊界之外的任何元素。 但僅憑這一點並不足以確保異常永遠不會發生。 再看看這些線:
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.