在c#中迭代时删除项目

时间:2015-09-02 12:18:25

标签: c#-4.0

我在foreach循环下面有代码块。我想将它转换为for循环,因为我们无法在使用foreach循环迭代它时修改集合。

 foreach (Price pax_price_entry in entry.Where(o => o.ID == (int)Price.PriceItemID.BookingFee))
                    {
                        //only if it's an "included in booking prices" booking fee price element
                        if (!pax_price_entry.RestrictedIndicator) booking_fees_amount += pax_price_entry.Amount;
                        //remove this price element - it will be re-created if needed
                        entry.Remove(pax_price_entry);
                    }

帮我在For循环中转换它。

2 个答案:

答案 0 :(得分:2)

抓住集合并重复计算。像这样:

var pax_price_entries = entry.Where(o => o.ID == (int)Price.PriceItemID.BookingFee).ToList();
for (var i = 0; i < pax_price_entries.Count(); i++)
{
    if (!pax_price_entries[i].RestrictedIndicator)
        booking_fees_amount += pax_price_entries[i].Amount;
    entry.Remove(pax_price_entries[i]);
}

转换为for循环并不是最重要的部分。将集合物化为自己的列表,以便您可以修改原始集合。

答案 1 :(得分:1)

我可以使用LINQ的ToLookup向您展示一种完全不同的方法吗?您可以创建一个lookup,其中包含两组条目,ID匹配的条目和所有其他条目。然后,您可以将此查找用于所有操作:

1。)创建查找:

var isMatchingID = entry.ToLookup(o => o.ID == (int)Price.PriceItemID.BookingFee);

2。)总结匹配ID的数量和RestrictedIndicator==false

int booking_fees_amount = isMatchingID[true]
    .Where(o => !o.RestrictedIndicator)
    .Sum(o => o.Amount);

3.。)从不匹配的ID条目(您的Remove):

创建列表
entry = isMatchingID[false].ToList();

如果您想保留旧条目,请将其分配给其他变量。

相关问题