-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

単一のステートメントで実行できる(読み取り可能な)ソリューションがわかりません。あなたがしていることは「クエリ」ではなく、 を使用してすでに見つかったいくつかのアイテムの操作(または2つ)です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をwithに置き換えると.ForEachlinq のように見えますが、あまり変わりません。


リストを保持および管理するクラス内にアトマー操作「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 に答える