使用Array.Copy将数组中的项目移入数组中

时间:2017-03-06 22:53:46

标签: c# arrays unity3d

尝试在Unity Monodevelop环境中使用Array.Copy,特别是我要做的是将数组的第一个插槽中的值移动到holder变量中,然后将数组中的每个值向前移动一个插槽,然后将值从holder变量移回到最后一个槽中的Array。我的相关代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class TurnController : MonoBehaviour {

//Array will hold all units (Being that they all have the EidolonClass script attached), then will be sorted by Speed, descending
private EidolonClass[] AllUnitArray;

...

void Awake(){
   //Find anything with the EidolonClass and then add it to the Array
   AllUnitArray = FindObjectsOfType (typeof(EidolonClass)) as EidolonClass[];
   //Sort the array by speed, descending (Highest speed listed first)
   Array.Sort (AllUnitArray, delegate(EidolonClass one, EidolonClass two) {
          return two.Speed.CompareTo(one.Speed);
          });
}

void pushArray(){
        EidolonClass store = AllUnitArray [0];
        for(int i=1;i<=AllUnitArray.Length;i++){
            Array.Copy (AllUnitArray, i, AllUnitArray, i-1, AllUnitArray.Length-1);
        }
        AllUnitArray [AllUnitArray.Length] = store;
        for(int i=0;i<=AllUnitArray.Length;i++) {
            Debug.Log (AllUnitArray[i].name.ToString ());
        }
    }

void Update () {
        if (Input.GetKeyDown (KeyCode.K)) {
            pushArray ();
        }
    }

此代码在Monodevelop中编译,但是当我尝试运行脚本的这一部分时,它会返回以下错误:

  

ArgumentException:length

     

System.Array.Copy(System.Array sourceArray,Int32 sourceIndex,System.Array destinationArray,Int32 destinationIndex,Int32 length)(at / Users / builduser / buildslave / mono / build / mcs / class / corlib / System / Array的.cs:971)   TurnController.pushArray()(在Assets / Scripts / Battle Scripts / TurnController.cs:54)   TurnController.Update()(在Assets / Scripts / Battle Scripts / TurnController.cs:37)

1 个答案:

答案 0 :(得分:1)

您的异常发生是因为您尝试多次复制相同的长度,但每次都有新的起始偏移。要移动数组的内容,只需调用Array.Copy()即可。

这样的事情:

void pushArray(){
    EidolonClass store = AllUnitArray [0];

    Array.Copy (AllUnitArray, 1, AllUnitArray, 0, AllUnitArray.Length - 1);
    AllUnitArray[AllUnitArray.Length - 1] = store;

    for(int i=0;i<=AllUnitArray.Length;i++) {
        Debug.Log (AllUnitArray[i].name.ToString ());
    }
}

也就是说,如果你希望能够转移&#34;那么数组似乎不是最好的数据结构。内容。如果您使用的是Queue<EidolonClass>对象,那么您可以Dequeue()第一个元素,然后Enqueue()使用相同的元素将其放在列表的后面。

就个人而言,我也不会为此烦恼。不要试图改变你的数据,只需保持一个索引,即哪个元素是最新的。增加索引以移动到下一个元素。如果到达数组的末尾(即索引值等于AllUnitArray.Length),则将索引设置回0。

实际上,Queue<T>类无论如何都在内部执行。因此,如果您喜欢Queue<T>类的语义,那么它的实现方式是相同的。