有没有一种方法可以在一个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查询中做到这一点

枚举集合时不能修改集合。因此,不能应用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));
    }