然而,所有的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?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)