-1

我在想这可能与.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());
}
4

3 回答 3

3

枚举时不能修改集合。因此不能应用 LINQ 表达式。

LIN*Q* 旨在支持查询,根据定义,查询不会修改其源。

于 2013-02-14T21:31:54.110 回答
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);
}

这两者实际上与你正在做的事情并没有太大的不同。替换foreachwith.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);
      }
    }
}
于 2013-02-14T21:31:47.633 回答
0

只有这样我才能看到你用一行来做,但这不是最好的阅读方式。

public void RemoveExpiredEnties(List<CartEntries> entries)
    {
        (entries.Where(e => e.IsExpired).ToList()).ForEach(item => entries.Remove(item));
    }
于 2013-02-14T22:28:49.270 回答