有没有办法在一个LINQ查询中执行此操作?

时间:2013-02-14 21:21:45

标签: c# linq

我在想.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());
}

3 个答案:

答案 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));
    }
相关问题