2013-02-14 86 views
-1

我在想這可能是.Where()有沒有辦法在一個LINQ查詢中做到這一點?

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()); 
} 
+2

您是否打算更改代碼?現在它與原始代碼有很大的不同......如果我發佈了我開始寫的答案,那麼很多代碼都會失效。 – 2013-02-14 21:25:59

+0

更改物品數量然後將其刪除的要點是什麼?他們是否在其他地方引用? – 2013-02-14 21:34:07

+0

@JonSkeet原始代碼沒有編譯。我一直在搞亂它,結果發佈了錯誤的版本。 – 2013-02-14 21:56:37

回答

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); 
     } 
    } 
} 
3

同時枚舉它不能修改的集合。因此不能應用LINQ表達式。

LIN * Q *旨在支持根據定義不修改其來源的查詢。

0

只有這樣我才能看到你用一條線做,但它不是最好的閱讀。

public void RemoveExpiredEnties(List<CartEntries> entries) 
    { 
     (entries.Where(e => e.IsExpired).ToList()).ForEach(item => entries.Remove(item)); 
    } 
相關問題