我有一个List<T>
,我希望能够向后复制到数组,这意味着从List.Count
开始,并从列表末尾开始复制可能有5个项目并向后移动。我可以通过一个简单的反向for
循环来做到这一点;然而,这可能是一种更快/更有效的方式,所以我想我应该问。我可以用某种方式使用Array.Copy
吗?
最初我使用的是Queue
,因为它按照我需要的正确顺序将其弹出,但我现在需要一次将多个项目弹出到一个数组中,我认为列表会更快。
答案 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);