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