有没有一种方法可以在一个LINQ查询中做到这一点
本文关键字:查询 LINQ 这一点 一个 一种 方法 有没有 | 更新日期: 2023-09-27 17:59:30
我认为.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());
}
枚举集合时不能修改集合。因此,不能应用LINQ表达式。
LIN*Q*旨在支持查询,根据定义,查询不会修改其来源。
我看不到一个(可读的)解决方案可以用一条语句完成。您所做的不是"查询",而是对已经使用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,但没有太大的变化。
您还可以考虑将原子操作"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);
}
}
}
我只能看到你用一行字来完成,但这不是最好的阅读方式。
public void RemoveExpiredEnties(List<CartEntries> entries)
{
(entries.Where(e => e.IsExpired).ToList()).ForEach(item => entries.Remove(item));
}