我在想.Where()
。
public void RemoveExpiredEntries(List<CartEntry> entries)
{
foreach (var entry in entries.Where(x => x.IsExpired()))
{
entry.Item.QuantityInCarts -= entry.Quantity;
}
entries.RemoveAll(x => x.IsExpired());
}
答案 0 :(得分:3)
枚举时无法修改集合。因此,不能应用LINQ表达式。
LIN * Q *旨在支持查询,根据定义,查询不会修改其来源。
答案 1 :(得分:1)
我看不到一个(可读的)解决方案,你可以用一个语句来完成它。你正在做的不是“查询”,它是使用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);
}
}
}
答案 2 :(得分:0)
只有这样我才能看到你用一条线做到这一点,但它并不是最好的阅读。
public void RemoveExpiredEnties(List<CartEntries> entries)
{
(entries.Where(e => e.IsExpired).ToList()).ForEach(item => entries.Remove(item));
}