gpt4 book ai didi

c# - IEnumerable 是否必须使用 Yield 才能延迟

转载 作者:太空狗 更新时间:2023-10-29 21:24:01 24 4
gpt4 key购买 nike

IEnumerable 是否必须使用 Yield 才能延迟?

这是帮助我理解延迟执行和 yield 的测试代码。

 //immediate execution
public IEnumerable Power(int number, int howManyToShow)
{
var result = new int[howManyToShow];
result[0] = number;
for (int i = 1; i < howManyToShow; i++)
result[i] = result[i - 1] * number;
return result;
}

//deferred but eager
public IEnumerable PowerYieldEager(int number, int howManyToShow)
{
var result = new int[howManyToShow];
result[0] = number;
for (int i = 1; i < howManyToShow; i++)
result[i] = result[i - 1] * number;

foreach (var value in result)
yield return value;
}

//deferred and lazy
public IEnumerable PowerYieldLazy(int number, int howManyToShow)
{
int counter = 0;
int result = 1;
while (counter++ < howManyToShow)
{
result = result * number;
yield return result;
}
}

[Test]
public void Power_WhenPass2AndWant8Numbers_ReturnAnEnumerable()
{
IEnumerable listOfInts = Power(2, 8);

foreach (int i in listOfInts)
Console.Write("{0} ", i);
}


[Test]
public void PowerYieldEager_WhenPass2AndWant8Numbers_ReturnAnEnumerableOfInts()
{
//deferred but eager execution
IEnumerable listOfInts = PowerYieldEager(2, 8);

foreach (int i in listOfInts)
Console.Write("{0} ", i);
}


[Test]
public void PowerYield_WhenPass2AndWant8Numbers_ReturnAnEnumerableOfIntsOneAtATime()
{
//deferred and lazy execution
IEnumerable listOfInts = PowerYieldLazy(2, 8);

foreach (int i in listOfInts)
Console.Write("{0} ", i);
}

最佳答案

没有使用yield - 最终你可以做一切 yield通过编写自定义枚举器 ( IEnumerator[<T>] ) 并将操作延迟到第一个 MoveNext() 来实现。 .但是,这实现起来非常痛苦。当然,如果您确实使用yield ,默认情况下延迟实现(您可以使用两种方法使其非延迟 - 一种不使用 yield ,然后访问数据后使用另一种方法(迭代器 block )来实现枚举器。

坦率地说,编写枚举器既困难又多问题。除非绝对必要,否则我会避免使用它。迭代器 block 很棒。

关于c# - IEnumerable 是否必须使用 Yield 才能延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9268776/

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