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

时间:2015-11-12 21:00:54

标签: 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.Length + 1; oldIndex++, newIndex++)
    {

        if (newIndex == location)
        {
          newMyArray[oldIndex] = element;
          oldIndex--;
        }
        else
        {
          newMyArray[newIndex] = myArray[oldIndex];
        }
      }

    myArray = newMyArray;

  }

我不是只想修复我的代码解决方案。我需要理解为什么会这样。

4 个答案:

答案 0 :(得分:0)

在for循环中,条件必须是oldIndex <= myArray.Length - 1oldIndex < myArray.Length,而非oldIndex < myArray.Length + 1

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;

  }

答案 1 :(得分:0)

你的麻烦源于它难以阅读。尝试不同的方法。

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;

  }

答案 2 :(得分:0)

所以主要的问题是for循环的条件。您正在尝试减少循环中的<script src="//app-sj05.marketo.com/js/forms2/js/forms2.min.js"></script> <form id="mktoForm_ourFormID"></form> <script> MktoForms2.loadForm("//app-sj05.marketo.com", "ourID", ourFormID, function(form) { // Set values in hidden field to determine asset to serve form.vals({ "Campaign_Asset__c":"assignedCampaignAsset" }); // Check to see if referring url set campaign ID, if not set value in hidden field if( !form.getValues()['Campaign_Id__c'] ) { form.setValues({ "Campaign_Id__c":"assignedCampaignID" }) } // Override redirect URL set in Marketo form.onSuccess(function(values, followUpUrl) { location.href = "redirectURL"; // Return false to prevent the submission handler continuing with its own processing return false; }); }); </script> 以跟踪已复制的项目,但由于它是您的循环变量,因此当oldIndex增加时,您实际上最终会超过新数组的末尾每一次。

newIndex更改为条件中的循环变量:

newIndex

请注意,这比将条件更改为for (int oldIndex = 0, newIndex = 0; newIndex < myArray.Length + 1; oldIndex++, newIndex++) 更有效,因为它会错过在最后位置添加新项目。

请注意,即使您无法使用oldIndex < myArray.Length,这实际上也过于复杂,因为有内置的复制数组的方法。例如:

List<string>

答案 3 :(得分:-2)

您的代码:

for (int oldIndex = 0, newIndex = 0; oldIndex < myArray.Length + 1; oldIndex++, newIndex++)

将抛出索引超出范围的异常。为什么?好吧,只需仔细阅读代码即可。基本上,你需要假装你是Visual Studio调试器,并逐步完成代码(相信我,我们都这样做)。当您走过代码时,我想您很快就会意识到这是您真正需要做的事情:

for (int oldIndex = 0, newIndex = 0; oldIndex < myArray.Length; oldIndex++, newIndex++)

原因是,您打算走数组(比新数组少1个数组),并将值复制到新数组。但是实际的代码试图在旧的数组中使用 new 数组中的元素数量加上一个...是的 - 你有相反的运算符。十分简单!