【问题标题】:Possible Multiple Enumeration Scenario. How to handle? [duplicate]可能的多重枚举方案。如何处理? [复制]
【发布时间】:2021-10-26 07:10:15
【问题描述】:
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 始终为零。不应该是这样的。 有什么建议吗?

【问题讨论】:

  • 我建议使用ToDictionary 而不是ToList,因为您需要通过 id 查找元素。它将复杂度从 n^2 降低到 n
  • @JL0PD:但他需要返回IEnumerable&lt;ComputedData&gt;
  • 为源和预期结果集合提供两个或三个示例值将非常有助于找到所需的解决方案。

标签: c#


【解决方案1】:

警告是为了确保每次您遍历 computeDate 中的项目时都不会重新执行此操作:

var computedDate = data.Select(i => new ComputedData()
{
    ID = i.ID,
    Result = i.value1 + i.value2
}).

这反过来又可以重新执行产生IEnumerable&lt;DataSet&gt; data的任何方法。

解决这个问题的方法很少。一个简单的方法是添加:

var computedDate = data.Select(i => new ComputedData()
{
    ID = i.ID,
    Result = i.value1 + i.value2
}).ToArray(); // <---- Add this

在这行代码枚举data 中的项目后,结果将存储在一个数组中,这意味着您可以安全地一次又一次地枚举它,而无需执行此Select 或任何其他意外。

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2014-06-13
    • 2010-11-24
    • 1970-01-01
    相关资源
    最近更新 更多