gpt4 book ai didi

c# - ToLookup 是否强制立即执行序列

转载 作者:行者123 更新时间:2023-11-30 20:19:23 27 4
gpt4 key购买 nike

我正在研究将可枚举序列转换为字典类型数据结构的 Enumerable.ToLookup API。可以在此处找到更多详细信息:

https://msdn.microsoft.com/en-us/library/system.linq.enumerable.tolookup(v=vs.110).aspx

它与 ToDictionary 的唯一区别API是这样一个事实,如果键选择器导致重复键,它不会给出任何错误。我需要比较这两个 API 的延迟执行语义。据我所知,ToDictionary API 会导致立即执行序列,即它不遵循 LINQ 查询的延迟执行语义。谁能帮我解决 ToLookup API 的延迟执行行为?它与ToDictionary API 相同还是有一些区别?

最佳答案

很容易测试...

void Main()
{
var lookup = Inf().ToLookup(i => i / 100);
Console.WriteLine("if you see this, ToLookup is deferred"); //never happens
}

IEnumerable<int> Inf()
{
unchecked
{
for(var i=0;;i++)
{
yield return i;
}
}
}

回顾一下,ToLookup 贪婪地 在不延迟的情况下消耗源序列。

相比之下,GroupBy 运算符 延迟的,因此您可以编写以下内容而不会产生不良影响:

var groups = Inf().GroupBy(i => i / 100); //oops

但是,GroupBy贪心,因此当您枚举时,会消耗整个源序列。

这意味着

groups.SelectMany(g=>g).First();

也无法完成。

当您考虑分组问题时,很快就会明白,当将一个序列分成一组序列时,如果不完全消耗整个序列,就不可能知道即使只有一个组是否完整。

关于c# - ToLookup 是否强制立即执行序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38928613/

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