C#中的数组切割和合并

时间:2014-03-02 05:54:46

标签: c# arraylist

我正在尝试优化像C#中制作的蛇一样的游戏,其中我有一个ArrayList,其中包含存储的所有蛇体部分。我需要能够切割这个ArrayList,就好像它是一副卡片,在那里我将采用甲板的顶部并使其成为底部。这应该有助于澄清。

01234 => 01 234 => 234 01 => 23401

这个ArrayList可以大到300个元素,我需要让这个操作尽可能便宜,因为这个游戏适用于移动设备。

2 个答案:

答案 0 :(得分:2)

使用Array.Copy应该是到达目的地的最快方式。但它要求您使用T[]数组,而不是ArrayList

public void CutTop<T>(this T[] source, int nbOfItemsToCut) {
    if(source == null)
        throw new ArgumentNullException("source");

    var length = source.Length;
    if(nbOfItemsToCut > length)
        throw new ArgumentException("nbOfItemsToCut");

    var temp = new T[nbOfItemsToCut];
    Array.Copy(source, temp, nbOfItemsToCut);

    Array.Copy(source, nbOfItemsToCut, source, 0, length - nbOfItemsToCut);
    Array.Copy(temp, 0, source, length - nbOfItemsToCut, nbOfItemsToCut);
}

答案 1 :(得分:1)

由于您想要从头到尾移动项目,LinkedList<T>可能是一个不错的选择,假设您不经常访问列表中的随机元素:

public void MoveToEnd<T>(LinkedList<T> list, int count)
{
    if(list == null)
        throw new ArgumentNullException("list");
    if(count < 0 || count > list.Count)
        throw new ArgumentOutOfRangeException("count");

    for (int i = 0; i < count; ++i)
    {
        list.AddLast(list.First.Value);
        list.RemoveFirst();
    }
}

var snake = new[] { 0, 1, 2, 3, 4 };
var list = new LinkedList<int>(snake);
Console.WriteLine(string.Join(" ", list)); // 0 1 2 3 4
MoveToEnd(list, 2);
Console.WriteLine(string.Join(" ", list)); // 2 3 4 0 1

在任何情况下,我建议您测量在当前实现中执行此操作所需的时间,以确定是否确实需要优化此部件。