我正在调查可枚举.ToLookup将可枚举序列转换为字典类型数据结构的 API。更多详情可在这找到:
https://msdn.microsoft.com/en-us/library/system.linq.enumerable.tolookup(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/system.linq.enumerable.tolookup(v=vs.110).aspx
它的唯一区别是到字典 https://msdn.microsoft.com/en-us/library/bb549277(v=vs.110).aspxAPI 的事实是,如果键选择器导致重复键,它不会给出任何错误。我需要比较这两个 API 的延迟执行语义。据我所知,到字典API 导致序列立即执行,即它不遵循 LINQ 查询的延迟执行语义。任何人都可以帮助我解决延迟执行行为ToLookupAPI?是不是一样到字典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
greedily不延迟地消耗源序列。
相比之下,GroupBy
操作员isdefered,所以你可以编写以下内容而不会产生不良影响:
var groups = Inf().GroupBy(i => i / 100); //oops
然而,GroupBy
is greedy,因此当您枚举时,整个源序列都会被消耗。
这意味着
groups.SelectMany(g=>g).First();
也无法完成。
当您考虑分组问题时,很快就会发现,当将一个序列分成一系列组时,如果不完全消耗整个序列,就不可能知道其中一个组是否完整。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)