0

我在 c# 中使用以下代码,如下所示。

var result = (from o in db.tblOrderMasters
              join od in db.tblOrderDetails on o.order_id equals od.orderdetails_orderId
              join c in db.tblCountryMasters on o.order_dCountry equals c.country_id
              join cu in db.tblCustomers on o.order_Custid equals cu.cust_id
              where o.order_id == orderid && o.order_active == true && o.order_IsDeleted == false && (o.order_status == 2)
              select new
              {
                 Code = o.order_code,
                 Name = o.order_dFirstName + " " + o.order_dLastName,
                 Quantity = od.Quantity,
                 [...snip...]
              }).ToList();

var Qresult =  result;
try
{
    foreach (var r in result)
    {
         if (r.Quantity > 1)
         {
             for (int i = 1; i < r.Quantity; i++)
             {
                  Qresult.Add(r);
             }
         }
    }
}

收藏已修改;枚举操作可能无法执行。

当我阅读与此错误相关的其他答案时,他们说您在迭代列表时无法修改列表,但是在我的代码中,我没有修改result列表,而是更改了一个新列表Qresult并迭代主列表,result list为什么会出现这个错误来了 ?

我想在这里提到的另一件事是,当我使用时,quickwatch 我可以在结果项中看到这一行也添加了

  Qresult.Add(r);

但我正在添加项目,Qresult所以为什么要添加项目result

4

3 回答 3

8

你写 :

var Qresult =  result;

foreach (var r in result) //result is Qresult
{ 
   .. 
   Qresult.Add(r);

}

就像写一样:

foreach (var r in Qresult) 
{ 
   .. 
   Qresult.Add(r);

}

所以你实际上改变了收藏

于 2013-07-05T06:39:07.580 回答
3

所以你想克隆这个匿名类型Quantity-times。由于您无法修改 foreach 中的集合(并且将列表分配给不同的变量不会创建副本),因此您可以使用此 Linq:

var Qresult =  result
    .SelectMany(o => Enumerable.Range(1, o.Quantity)
        .Select(i => new {
              Code = o.order_code,
              Name = o.order_dFirstName + " " + o.order_dLastName,
              Quantity = od.Quantity,
              [...snip...]
        }    
    )).ToList();
于 2013-07-05T06:47:46.920 回答
1

Qresult是与结果相同的对象 - 两者都引用内存中的相同对象。不要使用匿名对象并创建新对象List,因为

var Qresult =  new List<YourObject>();
try
{
    foreach (var r in result)
    {
        if (r.Quantity > 1)
        {
            for (int i = 1; i < r.Quantity; i++)
            {
                Qresult.Add(r);
            }
        }
    }
}
于 2013-07-05T06:42:26.590 回答