gpt4 book ai didi

c# - 了解 yield 关键字和 LINQ

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

我试图更好地理解 yield 关键字,我认为我对它有足够的了解,所以我进行了一些测试,但我对结果感到惊讶。

如果我运行下面的代码,我会得到以下输出,表明它在整个范围内循环,而不仅仅是直到数字 4。

    public void DoIt()
{
Console.WriteLine("Method Call");
var results = GetData(Enumerable.Range(1, 10));
Console.WriteLine("LINQ");
var filtered = results.Where(x => x == 4);
Console.WriteLine("Start result loop");
foreach (var item in filtered)
{
Console.WriteLine("Item is " + item);
}
}

private IEnumerable<int> GetData(IEnumerable<int> Input)
{
foreach (int item in Input)
{
if (item % 2 == 0)
{
Console.WriteLine("Found " + item);
yield return item;
}
}
}

输出:

Method Call
LINQ
Start result loop
Found 2
Found 4
Item is 4
Found 6
Found 8
Found 10

如果我运行下面的代码,它会显示它只到达 4 然后停止。

    public void DoIt()
{
Console.WriteLine("Method Call");
var results = GetData(Enumerable.Range(1, 10));
Console.WriteLine("Start result loop");
foreach (var item in results)
{
if (item == 4)
{
Console.WriteLine("Item is " + item);
break;
}
}
}

private IEnumerable<int> GetData(IEnumerable<int> Input)
{
foreach (int item in Input)
{
if (item % 2 == 0)
{
Console.WriteLine("Found " + item);
yield return item;
}
}
}

输出:

Method Call
Start result loop
Found 2
Found 4
Item is 4

我想我没有理解什么,但看起来 LINQ 正在做与我期望它做的相反的事情?尽管 LINQ 也使用了 yield 和延迟执行,但我希望第二组代码的结果与第一组代码相同。

最佳答案

它确实使用了延迟执行。 LINQ Where 检查输入可枚举的所有元素,它不会在找到第一个元素时停止。这就是 First 所做的。

如果您将 Where 更改为 First,或者如果您从第二个例子。

关于c# - 了解 yield 关键字和 LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9515118/

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