-2

我正在尝试将一个项目添加到 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

4 回答 4

0

所以主要问题是for循环的条件。您试图oldIndex在循环内减少以跟踪哪些项目已被复制,但由于它是您的循环变量,您实际上最终会运行超过新数组的末尾,因为newIndex每次都会递增。

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

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

请注意,这比将条件更改为oldIndex < myArray.Length会错过在最后一个位置添加新项目的效果更好。

请注意,即使您不能使用,这实际上也过于复杂,List<string>因为有用于复制数组的内置方法。例如:

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;
}
于 2015-11-12T21:30:35.510 回答
0

在 for 循环中,条件必须是oldIndex <= myArray.Length - 1 or oldIndex < myArray.Length, not 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;

  }
于 2015-11-12T21:08:53.467 回答
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;

  }
于 2015-11-12T21:21:16.720 回答
-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 的数组),并将值复制到新数组中。但是实际的代码是试图遍历旧数组,以获得数组中元素的数量一......是的 - 你有相反的运算符。十分简单!

于 2015-11-12T21:10:07.497 回答