C# 向后复制数组?数组,收到了吗?

C# 向后复制数组?数组,收到了吗?,c#,arrays,copy,reverse,C#,Arrays,Copy,Reverse,我有一个列表,我希望能够向后复制到数组中,这意味着从列表开始。计数并从列表末尾开始向后复制5个项目。我可以用一个简单的反向for循环来实现这一点;然而,可能有一种更快/更有效的方法来实现这一点,所以我想我应该问一下。我是否可以使用Array.Copy 最初我使用的是队列,因为它会按我需要的正确顺序弹出,但现在我需要将多个项目同时弹出到一个数组中,我认为列表会更快。这不可能比简单的for循环更快。你可以通过多种方式完成它,但是最快的方法就是以你自己的方式获取元素。您可以使用Array.Revers

我有一个
列表
,我希望能够向后复制到数组中,这意味着从
列表开始。计数
并从列表末尾开始向后复制5个项目。我可以用一个简单的反向
for
循环来实现这一点;然而,可能有一种更快/更有效的方法来实现这一点,所以我想我应该问一下。我是否可以使用
Array.Copy


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

这不可能比简单的
for
循环更快。

你可以通过多种方式完成它,但是最快的方法就是以你自己的方式获取元素。您可以使用Array.Reverse、Array.Copy等,也可以使用LINQ和extension方法,这两种方法都是有效的替代方法,但它们不会更快。

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

我不建议将性能作为使用数组的理由。不过,反过来说。这是一个非常微小的差异,当您将它加载到一个
列表中时,它将再次在数组中循环。无论如何,在您分析应用程序并确定性能瓶颈之前,您不应该担心性能

    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;
        }
    }
公共静态无效测试()
{
var a=可枚举的.Range(0,1000000).ToArray();
var stopwatch=stopwatch.StartNew();

对于(int i=0;i在您的评论中:

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

使用
for
循环向后迭代
列表
和一次提交一条记录到数据库之间有一个很大的区别。前者很好;没有人支持后者

为什么不先迭代——填充一个数组——然后将该数组发送到数据库中,全部填充

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);
var myArray=newt[numItemsYouWantToSend];
int-arrayIndex=0;
for(int i=myList.Count-1;arrayIndex
“所以我认为列表会更快。”-你衡量过性能问题吗?如果没有,你是过早地进行微观优化…而过早的优化是万恶之源(克努特)不,但使用队列,我一次只能弹出一个队列,但使用列表,我可以生成一个范围,在大多数情况下更快。事实上,在范围上操作并不更快,除非你添加到
列表中(因为
容量
)@daniel:可能,但幅度很小。(除非差距很大)我已经确定这是一个巨大的性能瓶颈。目前,我们正在提取一个结果,一次提交一个数据库,但我要让它一次提交一个范围,但它需要有序。这就是为什么我要这么做。@daniel,但我假设瓶颈是一次对数据库执行一个查询,而不是rever唱这首歌。没错,我没有直接思考xD