2012-01-04 11 views
7

Tôi đang tìm kiếm một phương thức trong ConcurrentDictionary cho phép tôi xóa một mục nhập bằng khóa, nếu và chỉ nếu giá trị bằng một giá trị mà tôi chỉ định, tương tự như TryUpdate, nhưng để xóa.Phương pháp xóa đồng thời của ConcurrentDictionary Loại bỏ

Phương pháp duy nhất mà thực hiện điều này có vẻ là phương pháp này:

ICollection<KeyValuePair<K, V>>.Remove(KeyValuePair<K, V> keyValuePair) 

Nó được thực hiện rõ ràng của giao diện ICollection, nói cách khác, tôi phải bỏ ConcurrentDictionary của tôi để một ICollection đầu tiên vì vậy mà tôi có thể gọi Xóa.

Xóa chính xác những gì tôi muốn và việc truyền đó không phải là vấn đề lớn, cũng như mã nguồn cho thấy nó gọi phương thức riêng TryRemovalInternal với bool matchValue = true, vì vậy tất cả đều đẹp và sạch sẽ. Tuy nhiên, những gì tôi lo ngại là nó không được ghi nhận là phương pháp Remove ConcurrentDictionary đồng thời tối ưu, vì vậy http://msdn.microsoft.com/en-us/library/dd287153.aspx chỉ sao chép bản mẫu ICollection, và How to: Add and Remove Items from a ConcurrentDictionary cũng không đề cập đến phương thức đó.

Có ai biết nếu đó là cách để đi, hoặc có một số phương pháp khác mà tôi đang thiếu?

+0

Có vẻ đúng (vì đó là cùng một phương thức mà 'TryRemove' gọi, chỉ với' matchValue' đặt sai và 'oldValue' mặc định) –

+2

Mặc dù nó không phải là tài liệu chính thức, nó có thể hữu ích: http: // blog. msdn.com/b/pfxteam/archive/2011/04/02/10149222.aspx – alexm

+0

@alexm Điều này là yên tâm đủ - Nếu bạn biến điều đó thành câu trả lời, tôi sẽ chấp nhận nó! MS thực sự nên cập nhật tài liệu của họ, nếu đúng là gần đây họ đã "thấy một vài người yêu cầu hỗ trợ thêm về ConcurrentDictionary" ... –

Trả lời

4

Mặc dù nó không phải là tài liệu chính thức, this MSDN blog post có thể hữu ích. Ý chính của bài viết đó: truyền tới ICollection và gọi phương thức Remove của nó, giống như được mô tả trong câu hỏi, là cách để đi.

Dưới đây là một đoạn trích từ các bài đăng blog trên, bao bọc nó thành một phương pháp TryRemove mở rộng:

public static bool TryRemove<TKey, TValue>(
    this ConcurrentDictionary<TKey, TValue> dictionary, TKey key, TValue value) 
{ 
    if (dictionary == null) 
     throw new ArgumentNullException("dictionary"); 
    return ((ICollection<KeyValuePair<TKey, TValue>>)dictionary).Remove(
     new KeyValuePair<TKey, TValue>(key, value)); 
} 
0

Nếu bạn không cần tất cả các chuông & còi của ConcurrentDictionary, bạn chỉ có thể tuyên bố loại của bạn như một IDictionary.

public class ClassThatNeedsDictionary 
{ 
    private readonly IDictionary<string, string> storage; 

    public ClassThatNeedsDictionary() 
    { 
     storage = new ConcurrentDictionary<string, string>(); 
    } 

    public void TheMethod() 
    { 
     //still thread-safe 
     this.storage.Add("key", "value"); 
     this.storage.Remove("key"); 
    } 
} 

Tôi thấy điều này hữu ích trong trường hợp bạn chỉ cần thêm và xóa, nhưng vẫn muốn lặp lại an toàn theo chuỗi.

+0

Nếu có kịch bản ở nơi bạn sử dụng ConcDic, nhưng không cần phương pháp chuyên môn của nó, tôi đã không đi qua chúng. Nhưng nếu có, đề nghị của bạn chắc chắn sẽ làm cho dư thừa mà đúc. Otoh, tôi khá chắc chắn đây là một "diễn viên biên dịch thời gian" anyway, do đó, không có hình phạt hiệu suất nào. Mã hơi xấu xí. –

+0

Trong trường hợp bạn muốn thêm và xóa các đối tượng khỏi từ điển cùng một lúc mà nó đang được lặp lại. Là ConcurrentDictionary cung cấp một bản chụp chính, bạn sẽ không nhận được một ngoại lệ. – greyalien007