C#-将元素添加到数组会导致IndexOutOfRangeException未处理
我正在尝试向C#中的数组添加项。我不能走快捷方式,例如使用列表 我知道要做到这一点,我必须创建一个新数组。这是我已经拥有的代码C#-将元素添加到数组会导致IndexOutOfRangeException未处理,c#,arrays,indexoutofrangeexception,C#,Arrays,Indexoutofrangeexception,我正在尝试向C#中的数组添加项。我不能走快捷方式,例如使用列表 我知道要做到这一点,我必须创建一个新数组。这是我已经拥有的代码 public void addAtLocation(int location, String element) { String[] newMyArray = new string[myArray.Length + 1]; for (int oldIndex = 0, newIndex = 0; oldIndex < myArray.Le
public void addAtLocation(int location, String element)
{
String[] newMyArray = new string[myArray.Length + 1];
for (int oldIndex = 0, newIndex = 0; oldIndex < myArray.Length + 1; oldIndex++, newIndex++)
{
if (newIndex == location)
{
newMyArray[oldIndex] = element;
oldIndex--;
}
else
{
newMyArray[newIndex] = myArray[oldIndex];
}
}
myArray = newMyArray;
}
public void addAtLocation(int位置,字符串元素)
{
String[]newMyArray=新字符串[myArray.Length+1];
对于(int-oldIndex=0,newIndex=0;oldIndex
我不是在寻找修复我的代码的解决方案。我需要理解为什么会发生这种情况 在for循环中,条件必须是您的代码:
for (int oldIndex = 0, newIndex = 0; oldIndex < myArray.Length + 1; oldIndex++, newIndex++)
for(int-oldIndex=0,newIndex=0;oldIndex
将抛出索引越界异常。为什么?好吧,只要仔细浏览一下代码就行了。基本上,您需要假装自己是VisualStudio调试器,并逐步完成代码(相信我,我们都会这么做)。当您了解代码时,我想您会很快意识到这是您真正需要做的:
for (int oldIndex = 0, newIndex = 0; oldIndex < myArray.Length; oldIndex++, newIndex++)
for(int-oldIndex=0,newIndex=0;oldIndex
原因是,您打算遍历旧的数组(比新数组小1的数组),并将值复制到新数组。但是实际的代码试图在新数组加一中遍历旧数组中的元素数。。。是的-你有另一个接线员。轻松点 你的麻烦源于阅读困难。尝试不同的方法
public void addAtLocation(int location, String element)
{
String[] newMyArray = new string[myArray.Length + 1];
int addedUnit = 0;//sort of like a flag to indicate the element has been inserted
for (int i = 0; i < myArray.Length; i++)
{
if (i == location)
{
newMyArray[i] = element;
newMyArray[i+1] = myArray[i]; //add two elements
addedUnit = 1;
}
else
{
newMyArray[i+addedUnit] = myArray[i];
}
}
myArray = newMyArray;
}
public void addAtLocation(int位置,字符串元素)
{
String[]newMyArray=新字符串[myArray.Length+1];
int addedUnit=0;//有点像一个标志,指示元素已插入
for(int i=0;i
因此,主要问题是for循环的条件。您试图在循环中减少oldIndex
,以跟踪哪些项已被复制,但由于它是您的循环变量,您实际上会在newIndex
每次递增时运行到新数组的末尾
将newIndex
更改为条件中的循环变量:
for (int oldIndex = 0, newIndex = 0; newIndex < myArray.Length + 1; oldIndex++, newIndex++)
调试时,哪一行抛出异常,发生异常时的运行时值是多少?还有,你到底为什么不能只使用
列表
?如果没有+1
,结束标准不应该是oldIndex
?我不明白你为什么不能选择“快捷方式”并使用列表
。不需要“重新发明轮子”。另外,列表
通常比每次添加时调整数组大小更有效。在将其用于for循环条件之前,您需要将此代码myArray.Length+1
存储在一个变量中。如果您不这样做,它将重新估计每个循环,这些循环可能会产生微妙的错误。如果您真的一心想使用数组,那么也可以先使用列表,然后使用扩展方法将这些值分配给数组。该列表的ToArray()例如var myList=new List()var myArray=myList.ToArray()
我个人会坚持使用列表
它应该是如果你通过myArray,你必须一直到for (int oldIndex = 0, newIndex = 0; newIndex < myArray.Length + 1; oldIndex++, newIndex++)
public void addAtLocation(int location, string element)
{
string[] newMyArray = new string[myArray.Length + 1];
Array.Copy(myArray, 0, newMyArray, 0, location);
newMyArray[location] = element;
Array.Copy(myArray, location, newMyArray, location + 1, myArray.Length - location);
myArray = newMyArray;
}