我看不到一个(可读的)解决方案,你可以用一个语句来做到这一点。您正在做的不是“查询”,而是对已经使用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
with.ForEach
看起来更像 linq,但并没有太大改变。
您还可以考虑将原子操作“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);
}
}
}