我有一个List<T>
我希望能够向后复制到数组的内容,这意味着从List.Count
列表末尾开始并复制可能 5 个项目并向后工作。我可以用一个简单的反向for
循环来做到这一点;但是可能有一种更快/更有效的方法来做到这一点,所以我想我应该问一下。我可以Array.Copy
以某种方式使用吗?
最初我使用的是Queue
as ,它以我需要的正确顺序弹出它,但我现在需要一次将多个项目弹出到一个数组中,我认为列表会更快。
看起来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;
}
}
不可能比简单的for
循环更快地做到这一点。
您可以通过多种方式完成它,但最快的方法是完全按照您的方式获取元素。您可以使用 Array.Reverse、Array.Copy 等,也可以使用 LINQ 和扩展方法,两者都是有效的替代方案,但它们不应该更快。
在您的一条评论中:
目前我们正在提取一个结果并一次将其提交到数据库
使用循环向后迭代 a和一次将记录提交到数据库之间有很大的区别。前者很好;没有人支持后者。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);