我在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循环中转换它。
答案 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();
如果您想保留旧条目,请将其分配给其他变量。