【问题标题】:Array cutting and merging in C#C#中的数组切割和合并
【发布时间】:2014-04-03 04:20:58
【问题描述】:

我正在尝试优化用 C# 制作的类似蛇的游戏,其中我有一个 ArrayList,其中包含存储的所有蛇身体部位。我需要能够剪切这个 ArrayList,就像它是一副纸牌一样,我会在其中占据纸牌的顶部并使其成为底部。这应该有助于澄清。

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

这个 ArrayList 可以有 300 个元素,我需要让这个操作尽可能便宜,因为这个游戏是为移动设备设计的。

【问题讨论】:

  • 一些过早的优化
  • 列表的类型是什么?
  • 您需要性能吗?不要使用ArrayList。改用泛型集合。
  • 问题是我需要一个 resizabke 数组,我可以在其中放置身体部位。我正在使用 Unity 3D,它是一个 GameObject ArrayList。我考虑过使用堆栈,但我需要能够一次访问所有元素并且我需要它来改变大小。

标签: c# arraylist


【解决方案1】:

使用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);
}

【讨论】:

    【解决方案2】:

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

    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
    

    无论如何,我建议您测量在当前实现中执行此操作所需的时间,看看是否真的有必要优化这部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 2017-02-12
      相关资源
      最近更新 更多