gpt4 book ai didi

c# - 对于 LINQ 中的每个选择

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

对于比我更了解 .Net 内部工作原理的人来说,这是一个简短的问题::- )。我只是确定我理解了一些东西。

我的看法是,当您在 foreach 中运行 LINQ 时,会评估(运行)LINQ 枚举器,它返回一个集合,然后 foreach 继续处理该集合。但是……我仍然不确定:

foreach (VCCTreeItem ti in (from treeItems in TreeItems select treeItems))

是否在每个循环中重新评估(执行)LINQ 语句?我会认为(并希望)不。但是,在 foreach 中对集合进行操作时,如果修改了集合,您会在运行时收到错误消息。这让我相信幕后可能发生了一些可疑的事情。我从来没有时间详细拆解/检查这个,所以这就是我问你这个的原因。我敢肯定你们中的一些人从他们的头顶知道答案::- D。

哦,我想我可以问同样的问题:

foreach (VCCTreeItem ti in TreeItems)

如果 TreeItems 是一个属性,我在其 get 中执行了一些操作,该属性将被评估,作为值返回,foreach 将对该值进行操作。

最佳答案

IEnumerable 不会重新求值。像这样的 foreach 语句:

IEnumerable<Foo> enumerable = ...;
foreach (Foo f in enumerable) {
...
}

对应于此(编辑:enumerator 也放在 using block 中,如@Double Down 所示):

IEnumerable<Foo> enumerable = ...;
IEnumerator<Foo> enumerator = enumerable.GetEnumerator();
while (enumerator.MoveNext()) {
Foo f = enumerator.Current;
...
}

因此,如果您有一些代价高昂的操作来生成您要循环访问的集合,这不是问题;它只会生产一次。但是,在 LINQ 中,正如@Double Down 所说,大多数结果都是延迟生成的 - 因此对 GetEnumerator() 的调用几乎什么都不做,而每次调用 MoveNext( )。总的来说,这与在一次操作中生成整个列表一样耗时,但它节省了内存(永远不会生成包含所有元素的实际 List;一次获取一个元素,然后丢弃它).

关于c# - 对于 LINQ 中的每个选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5121955/

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