我看不到一個(可讀的)解決方案,您可以使用單個語句執行此操作。您所做的不是「查詢」,而是對已使用Where
找到的某些項目進行的操作(或兩項操作)。
我可能會做到以下幾點:
var expiredEntries = entries.Where(x => x.IsExpired()).ToArray();
foreach (var entry in expiredEntries)
{
entry.Item.QuantityInCarts -= entry.Quantity;
}
entries.RemoveAll(expiredEntries);
或者
foreach (var entry in entries.Where(x => x.IsExpired()).ToArray())
{
entry.Item.QuantityInCarts -= entry.Quantity;
// remove works here, because it created an array with expired items.
entries.Remove(entry);
}
這兩者都是實際上不是你在做什麼很大的不同。更換foreach
與.ForEach
看起來更像linq,但不會改變太多。
您也可以考慮封裝保存和管理列表中的類內的atomar操作「RemoveEntry」:
class Cart
{
List<CartEntry> entries;
public void RemoveEntry(CartEntry entry)
{
entry.Item.QuantityInCarts -= entry.Quantity;
entries.Remove(entry);
}
public void RemoveExpiredEntries()
{
foreach (var entry in entries.Where(x => x.IsExpired()).ToArray())
{
RemoveEntry(entry);
}
}
}
您是否打算更改代碼?現在它與原始代碼有很大的不同......如果我發佈了我開始寫的答案,那麼很多代碼都會失效。 – 2013-02-14 21:25:59
更改物品數量然後將其刪除的要點是什麼?他們是否在其他地方引用? – 2013-02-14 21:34:07
@JonSkeet原始代碼沒有編譯。我一直在搞亂它,結果發佈了錯誤的版本。 – 2013-02-14 21:56:37