gpt4 book ai didi

c# - 循环中 Enumerable Count 方法的性能

转载 作者:行者123 更新时间:2023-12-05 08:21:41 24 4
gpt4 key购买 nike

我有一个由 IEnumerable 表示的项目序列

我需要遍历这些项目,它应该是一个for-loop,因为索引很重要。

我的问题是,以下两个选项在性能上是否存在差异?

1.

for (int i = 0; i < items.Count(); i++)
{
//Do something
}
var itemsLength = items.Count();

for (int i = 0; i < itemsLength; i++)
{
//Do something
}

换句话说,items.Count() 方法是否在选项 1 中的每次迭代中一次又一次地运行?

最佳答案

在可枚举源上调用 Count() 将耗尽可枚举直到所有元素都被枚举。因此,在 for 循环的条件 block 中对可枚举项调用 Count() 将因此在每次迭代时耗尽可枚举项。例如调用

var numbers = VerboseRange(1, 5);
for (var index = 0; index < numbers.Count(); index++)
{
Console.WriteLine($"For-loop is at index {index}...");
}

IEnumerable<int> VerboseRange(int start, int count)
{
foreach (var number in Enumerable.Range(start, count))
{
Console.WriteLine($"Yielded number {number}.");
yield return number;
}
}

会输出

Yielded number 1.
Yielded number 2.
Yielded number 3.
Yielded number 4.
Yielded number 5.
For-loop is at index 0...
Yielded number 1.
Yielded number 2.
Yielded number 3.
Yielded number 4.
Yielded number 5.
For-loop is at index 1...
Yielded number 1.
Yielded number 2.
Yielded number 3.
Yielded number 4.
Yielded number 5.
For-loop is at index 2...
Yielded number 1.
Yielded number 2.
Yielded number 3.
Yielded number 4.
Yielded number 5.
For-loop is at index 3...
Yielded number 1.
Yielded number 2.
Yielded number 3.
Yielded number 4.
Yielded number 5.
For-loop is at index 4...
Yielded number 1.
Yielded number 2.
Yielded number 3.
Yielded number 4.
Yielded number 5.

因此,先计数比较好。

但是,我建议您使用一个计数器和一个foreach-loop

var count = 0;
foreach (var item in items)
{
// do something
count++;
}

在 C# 7.0 中,你终于可以做到了

foreach (var (item, index) in items.WithIndex())
{
// do something
}

关于c# - 循环中 Enumerable Count 方法的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70932545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com