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

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

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

看起来像Array.Reverse具有用于反转数组的本机代码,该代码有时不适用并且将回退到使用简单的for循环。 在我的测试中, Array.Reverse比简单的for循环快一点。 在将1,000,000个元素arrays反转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 

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

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

在你的一条评论中:

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

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

为什么不先迭代 – 填充一个数组 – 然后将该数组发送到数据库,所有填充?

 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);