Jef*_*f B 10 .net linq vb.net return return-value
我Collection was modified; enumeration operation may not execute在函数中返回LINQ查询的结果时遇到了很多错误,比如这样...(我应该添加函数作为接口的实现,结果让这个模块使用在另一个.)
Public Function GetTheFuzzyFuzzbuzzes() As IEnumerable(of FuzzBuzz) _
Implements IFoo.GetTheFuzzyFuzzBuzzes
Return mySecretDataSource.Where(Function(x) x.IsFuzzy)
End Function
Run Code Online (Sandbox Code Playgroud)
作为一项规则,.ToArray如果底层数据有可能被更改,我是否应该在函数或属性getter中返回LINQ查询结果时始终调用?我知道这样做有一点效率,但我觉得这是安全的事情,因此应该总是这样做以避免时间耦合问题.
编辑:
让我更好地解释问题领域.
我们有一个基于图形的实现我们主要关注的领域,这是一个优化问题.实体表示为图节点.用各种成本和其他参数加权的边缘表示节点之间的关系.当用户操纵数据时,我们创建不同的边缘并评估它们可以针对当前状态采取的各种选项,以便为每个选项的结果提供反馈.其他用户和程序对服务器上的数据所做的更改会立即通过推送技术传播到客户端.我们使用了大量的线程......
......所有这些意味着我们以非常异步的方式发生了很多事情.
我们的程序分为模块(基于单一责任原则)和合同项目以及运行时解决的实施项目,这意味着我们非常依赖接口.我们通常通过使用IEnumerable的模块之间的数据(因为它们是一种-的排序-的不可变的).
通常,您不应该总是调用.ToArray或.ToList返回LINQ查询的结果.
这两个.ToArray和.ToList是"贪婪"(相对于懒惰),实际上对你的数据源进行查询操作.适合他们的地点和时间是架构决策.例如,您可以在项目中建立规则以实现数据访问层内的所有linq查询,从而处理所有数据层异常.或者只要有可能就不执行它们,并且只在最后获得所需的数据.还有许多与此主题相关的其他细节.
但是.ToArray当你从函数返回结果时调用或不调用- 这不是一个问题,在你提供更详细的样本之前它没有答案.
小智 5
不,我不会对此做出规定.
我理解你的担忧.主叫方可能不知道它的动作会影响查询结果.
在某些情况下,你真的不能这样做:
Any()或First()在您的查询上.两者都只需要读取第一个元素.所有其他工作都是徒劳的.另一方面,在许多情况下,当可以想到使用数组将具有将影响查询的副作用时,将查询具体化为数组更安全.
在编写软件时,听起来很有吸引力的规则说"当你需要在X和Y之间选择时,总是做X".我不相信有这样的规则.也许在15%你真的应该做X,在5%你绝对需要做Y,而对于其他情况,它无所谓.
对于那些剩下的80%,无所事事可能是合适的.如果你在ToArray()任何地方插入,代码错误地表明有这样做的原因.
| 归档时间: |
|
| 查看次数: |
368 次 |
| 最近记录: |