我在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
答案 0 :(得分:8)
你写道:
var Qresult = result;
foreach (var r in result) //result is Qresult
{
..
Qresult.Add(r);
}
就像写:
foreach (var r in Qresult)
{
..
Qresult.Add(r);
}
所以你更改实际上是集合
答案 1 :(得分: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();
答案 2 :(得分: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);
}
}
}
}