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ため、なぜこのエラーが発生するのかやってくる ?

ここでもう1つ言いたいのは、使用する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。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 に答える