4

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

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

4

4 回答 4

3

看起来Array.Reverse有用于反转数组的本机代码,该代码有时不适用,并且会退回到使用简单的 for 循环。在我的测试Array.Reverse中,它比简单的 for 循环要快得多。在这个将 1,000,000 元素数组反转 1,000 次的测试中,Array.Reverse大约需要 600 毫秒,而 for 循环大约需要 800 毫秒。

我不建议将性能作为使用的理由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;
        }
    }
于 2010-04-26T03:17:24.420 回答
1

不可能比简单的for循环更快地做到这一点。

于 2010-04-26T03:01:39.843 回答
0

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

于 2010-04-26T03:02:09.623 回答
0

在您的一条评论中:

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

使用循环向后迭代 a和一次将记录提交到数据库之间有很大的区别。前者很好;没有人支持后者。forList<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);
于 2010-04-26T03:26:04.490 回答