2011-04-14 159 views

回答

-5

嗯,我認爲最接近的是TakeWhile,如

myBlockingCollection.TakeWhile(m=>m == Item); 

當然的項目類型應實現IComparer什麼的,或者可能與ID或匹配的東西.....

+4

TakeWhile不會從阻塞集合中刪除任何內容,它只是返回值。 TakeWhile指的是標準的LINQ擴展方法。 – 2012-02-29 20:38:32

2

我認爲TryTake(out item)會工作。刪除在BlockingCollection類中不存在,Take不會將項目作爲參數。

+0

TryTake(out item)不指定刪除(item)那樣的項目。沒有等價物。 – pauldendulk 2017-02-23 12:47:04

4

我認爲只有TryTake()是一個選項?我在MSDN的Remove()方法上找不到文檔。

2

這個代碼怎麼樣? - 它正在工作,但改變了收集的順序。 (而且我沒有在多線程狀態下檢查它)。

public static bool Remove<T>(this BlockingCollection<T> self, T itemToRemove) 
    { 
     lock (self) 
     { 
      T comparedItem; 
      var itemsList = new List<T>(); 
      do 
      { 
       var result = self.TryTake(out comparedItem); 
       if (!result) 
        return false; 
       if (!comparedItem.Equals(itemToRemove)) 
       { 
        itemsList.Add(comparedItem); 
       } 
      } while (!(comparedItem.Equals(itemToRemove))); 
      Parallel.ForEach(itemsList, t => self.Add(t)); 
     } 
     return true; 
    } 
6

您無法指定要從BlockingCollection<T>中刪除的特定項目。

Take()方法從基礎集合中移除項目並返回已移除的項目。

TryTake(out T item)方法從基礎集合中刪除一個項目,並將刪除的項目分配給out參數。如果一個項目可以被刪除,該方法返回true;否則,是錯誤的。

刪除的項目取決於BlockingCollection<T>所使用的基礎集合 - 例如,ConcurrentStack<T>將具有LIFO行爲,而ConcurrentQueue<T>將具有FIFO行爲。

+0

這是正確的答案 – pauldendulk 2017-02-23 12:45:52