c# - 可能的多重枚举方案。怎么处理?
问题描述
public IEnumerable<ComputedData> Compute (IEnumerable<DataSet> data, IEnumerable<Variations> variationData)
{
// I need to create one ComputedData instance for each item inside the IEnumerable<DataSet> data
// DataSet has properties: int ID, int Valu1, int Value2
// ComputedData has properties: int ID, int Result, int Variation
// variationData has properties: int ID, int Variation
var computedDate = data.Select (i => new ComputedData ()
{
ID = i.ID,
Result = i.value1 + i.value2
});
// ISSUE is here
foreach (var item in computedDate )
{
var id = item.ID;
// I need to find the corresponding element
// (with same ID) on IEnumerable<Variations> variationData
// and assign item.Variation =
// But getting Possible Multiple Enumeration warning
// and item.Variation become zero always !
}
}
问题是使用 foreach 循环。有没有其他方法可以解决这个问题。即使代码正常工作, item.Variation 始终为零。不应该是这样的。有什么建议么 ?
解决方案
警告是为了确保每次您遍历其中的项目时computeDate
都不会重新执行此操作:
var computedDate = data.Select(i => new ComputedData()
{
ID = i.ID,
Result = i.value1 + i.value2
}).
反过来,它可以重新执行产生的任何方法IEnumerable<DataSet> data
。
处理这个问题的方法很少。一个简单的方法是添加:
var computedDate = data.Select(i => new ComputedData()
{
ID = i.ID,
Result = i.value1 + i.value2
}).ToArray(); // <---- Add this
这行代码枚举完data
结果中的项目后,将存储在一个数组中,这意味着您可以安全地一次又一次地枚举它,而无需执行此操作Select
或任何其他意外。
推荐阅读
- laravel - 在 Laravel 的 Vue 组件上将数据渲染到模态时出现问题
- java - 在 LIberty 21.0.0.6 的应用程序 [ABC_WSv2.1] 中获取由 servlet [JAX-RS Servlet] 创建的未捕获的 init() 异常
- php - 迁移 - 无法在控制台 Yii2 中实例化组件或类“db”
- java - 运行时组件丢失且已知更正不起作用
- django - 如何在 django celery 配置中更改“传输”网址
- java - 在我的项目中使用第二个会话工厂的 load() 会引发 org.hibernate.LazyInitializationException: could not initialize proxy - no session error
- apache - 使用重定向配置 vhost
- python - 从python中的函数返回后,指向浮点数的C类型指针发生变化
- c# - C# 堆栈跟踪包含随机字母
- expression-encoder-sdk - heloo 所有有才华的朋友我的 vs 代码打不开