c# – 为什么Linq扩展方法不是坐在IEnumerator而不是IEnumerable?

c# – 为什么Linq扩展方法不是坐在IEnumerator而不是IEnumerable?,第1张

概述有很多 Linq算法只需要一次通过输入,例如选择. 然而,所有的Linq扩展方法都位于IEnumerable而不是IEnumerator var e = new[] { 1, 2, 3, 4, 5 }.GetEnumerator(); e.Select(x => x * x); // Doesn't work 这意味着你不能在任何从“已经打开的”流中读取的情况下使用Linq. 这个方案正 有很多 Linq算法只需要一次通过输入,例如选择.

然而,所有的linq扩展方法都位于IEnumerable而不是IEnumerator

var e = new[] { 1,2,3,4,5 }.GetEnumerator();     e.Select(x => x * x); // Doesn't work

这意味着你不能在任何从“已经打开的”流中读取的情况下使用linq.

这个方案正在为我目前正在开发的项目发生很多事情 – 我想返回一个IEnumerator,其Idispose方法将关闭流,并且所有下游的linq代码都可以在此 *** 作.

简而言之,我有一个“已经打开”的结果流,我可以将其转换成适当的一次性IEnumerator – 但不幸的是,所有下游代码都需要一个IEnumerable而不是IEnumerator,尽管它只会执行一个“pass”.

即我想要在各种不同的来源(CSV文件,IDataReaders等)上“实现”这种返回类型:

class Tabularstream {     Column[] Columns;     IEnumerator<object[]> RowStream; }

为了获得“列”,我必须已经打开了CSV文件,启动了SQL查询,或者其他.然后我可以返回其“dispose”方法关闭资源的“IEnumerator”,但是所有linq *** 作都需要一个IEnumerable.

我知道的最好的解决方法是实现一个IEnumerable,其GetEnumerator()方法返回一个唯一的IEnumerator,如果有人尝试执行一次GetEnumerator()调用两次,则会抛出一个错误.

这一切听起来还是有一个更好的方法来实现“Tabularstream”的一个方便从linq使用的方式?

解决方法 使用IEnumerator< T>在我看来,直接很少是个好主意.

一方面,它编码了它是破坏性的事实 – 而liNQ查询通常可以多次运行.它们意味着是无副作用的,而迭代在IEnumerator< T>自然是副作用的.

这也使得实际上不可能在liNQ to Objects中执行一些优化,例如如果您实际上要求ICollection< T>使用Count属性,为它的数量.

对于您的解决方法:是的,OneshotEnumerable将是一个合理的方法.

总结

以上是内存溢出为你收集整理的c# – 为什么Linq扩展方法不是坐在IEnumerator而不是IEnumerable?全部内容,希望文章能够帮你解决c# – 为什么Linq扩展方法不是坐在IEnumerator而不是IEnumerable?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1238761.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存