C#-将元素添加到数组会导致IndexOutOfRangeException未处理

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

我正在尝试向C#中的数组添加项。我不能走快捷方式,例如使用列表

我知道要做到这一点,我必须创建一个新数组。这是我已经拥有的代码

  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;
}