C#索引超出数组的界限
我从一个文本文件中逐行读取,我将从文本文件中填充100个文本框(10x10行)。每行中有10个逗号,文本文件中有10行,因此我尝试从文本文件中读取值。但不管它如何显示索引是不允许的,有什么帮助吗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
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,这样也可以吗?@user2376998return
将立即退出整个方法。我认为这不是您想要的。@user2376998在哪一行?如果您按照我指定的代码使用,您将不会看到更多的indexoutboundsexception
's.@user2376998好的,但这仍然没有告诉我它是在哪一行抛出的