向后复制一个数组? Array.Copy?

时间:2010-04-26 02:56:51

标签: c# arrays copy reverse

我有一个List<T>,我希望能够向后复制到数组,这意味着从List.Count开始,并从列表末尾开始复制可能有5个项目并向后移动。我可以通过一个简单的反向for循环来做到这一点;然而,这可能是一种更快/更有效的方式,所以我想我应该问。我可以用某种方式使用Array.Copy吗?

最初我使用的是Queue,因为它按照我需要的正确顺序将其弹出,但我现在需要一次将多个项目弹出到一个数组中,我认为列表会更快。

4 个答案:

答案 0 :(得分:3)

看起来Array.Reverse具有用于反转数组的本机代码,该代码有时不适用,并且会回退到使用简单的for循环。在我的测试中,Array.Reverse比简单的for循环快一点。在1,000,000次元素阵列反转1000次的测试中,Array.Reverse约为600ms,而for循环约为800ms。

我不建议将性能作为使用Array.Reverse的理由。这是一个非常微小的差异,一旦你将它加载到List中,你将失去它,它将再次循环遍历数组。无论如何,在您分析应用程序并确定性能瓶颈之前,您不应该担心性能。

    public static void Test()
    {
        var a = Enumerable.Range(0, 1000000).ToArray();

        var stopwatch = Stopwatch.StartNew();

        for(int i=0; i<1000; i++)
        {
            Array.Reverse(a);
        }

        stopwatch.Stop();

        Console.WriteLine("Elapsed Array.Reverse: " + stopwatch.ElapsedMilliseconds);

        stopwatch = Stopwatch.StartNew();

        for (int i = 0; i < 1000; i++)
        {
            MyReverse(a);
        }

        stopwatch.Stop();

        Console.WriteLine("Elapsed MyReverse: " + stopwatch.ElapsedMilliseconds);
    }

    private static void MyReverse(int[] a)
    {
        int j = a.Length - 1;
        for(int i=0; i<j; i++, j--)
        {
            int z = a[i];
            a[i] = a[j];
            a[j] = z;
        }
    }

答案 1 :(得分:1)

不可能比简单的for循环更快地执行此操作。

答案 2 :(得分:0)

您可以通过多种方式完成任务,但最快的方法是以完全相同的方式获取元素。您可以使用Array.Reverse,Array.Copy等,或者您可以使用LINQ和扩展方法,两者都是有效的替代方案,但它们不应该更快。

答案 3 :(得分:0)

在你的一条评论中:

  

目前我们正在提取一个结果并一次将其提交给一个数据库

使用for循环向后迭代List<T>并将记录一次提交到数据库之间存在大差异。前者很好;没有人支持后者。

为什么不先迭代 - 填充一个数组 - 然后将数组发送到数据库中,所有这些都已填充?

var myArray = new T[numItemsYouWantToSend];

int arrayIndex = 0;
for (int i = myList.Count - 1; arrayIndex < myArray.Length; --i) {
    if (i < 0) break;
    myArray[arrayIndex++] = myList[i];
}

UpdateDatabase(myArray);