首页 > 解决方案 > 可能的多重枚举方案。怎么处理?

问题描述

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 始终为零。不应该是这样的。有什么建议么 ?

标签: c#

解决方案


警告是为了确保每次您遍历其中的项目时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或任何其他意外。


推荐阅读