我正在尝试优化像C#中制作的蛇一样的游戏,其中我有一个ArrayList,其中包含存储的所有蛇体部分。我需要能够切割这个ArrayList,就好像它是一副卡片,在那里我将采用甲板的顶部并使其成为底部。这应该有助于澄清。
01234 => 01 234 => 234 01 => 23401
这个ArrayList可以大到300个元素,我需要让这个操作尽可能便宜,因为这个游戏适用于移动设备。
答案 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
在任何情况下,我建议您测量在当前实现中执行此操作所需的时间,以确定是否确实需要优化此部件。