gpt4 book ai didi

c# - LINQ 扩展如何链接其他扩展

转载 作者:行者123 更新时间:2023-11-30 13:52:30 25 4
gpt4 key购买 nike

我在 2006 年学习了 C#,最近试图重新开始使用它。然后我了解到他们向 C#3.0 添加了称为 LINQ 扩展的东西。现在我熟悉了扩展方法,我只是在思考那些与 IEnumerables 相关的细节。

今天早些时候,我和我的一位同事在争论以下代码块是否等效:

List<int> integers;
IEnumerable<int> subResult = items.Where(i => IsPrime(i));
IEnumerable<int> orderedResult = subResult.OrderBy(i => i);

对比

List<int> integers;
IEnumerable<int> result = items.Where(i => IsPrime(i)).OrderBy(i => i);

他告诉我最新的更有效,因为扩展使用了对其源的延迟查询。我不太确定我是否理解他的意思,我想知道他是否正确。

最佳答案

它们是等价的。他们都使用延迟评估/延迟查询。

这意味着当 .Where 方法被调用时,它不会执行列表的任何实际枚举,它只是保留对其输入的引用和它将要检查的条件并存储这些引用。当稍后对 .Where 的结果调用 GetEnumerator 方法时,.Where 开始执行。

.OrderBy 相同。在调用 .GetEnumerator 之前,它实际上并不枚举列表。

这些东西可能很难理解,但有一些非常好的方法可以了解它。首先是编写一个像您一样的简单示例,最好分成多行,使用一个简单的 for-each 循环来迭代所有项目。调试代码并逐行执行。查看调试器如何跳转。一开始会很困惑,但运行几次后您就会明白惰性求值是如何工作的。

Jon Skeet 也有一个很棒的 LINQ 可视化演示。

https://msmvps.com/blogs/jon_skeet/archive/2008/02/20/visual-linq-watch-query-expressions-as-they-happen.aspx

关于c# - LINQ 扩展如何链接其他扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2234304/

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