2012-01-04 9 views
7

मैं ConcurrentDictionary में एक विधि की तलाश कर रहा था जो मुझे कुंजी द्वारा एक प्रविष्टि को हटाने की अनुमति देता है, अगर केवल तभी मूल्य निर्दिष्ट होता है जो कि मैं निर्दिष्ट करता हूं, समकक्ष के बराबर कुछ है, लेकिन निकासी के लिए।ConcurrentDictionary की आशावादी रूप से समवर्ती निकालें विधि

एकमात्र तरीका है कि यह करता है इस विधि प्रतीत हो रहा है:

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

यह है ICollection इंटरफ़ेस का स्पष्ट कार्यान्वयन, दूसरे शब्दों में, मैं पहली बार एक ICollection करने के लिए अपने ConcurrentDictionary कास्ट करने के लिए है, ताकि मैं निकालें कॉल कर सकते हैं।

निकालें बिल्कुल वही करती है कि मैं क्या चाहते हैं, और है कि कलाकारों, या तो कोई बड़ी बात नहीं है भी स्रोत कोड यह bool matchValue = सच साथ निजी विधि TryRemovalInternal कॉल से पता चलता है, तो यह सब अच्छे और साफ लग रहा है।

मुझे क्या चिंता थोड़ा लेकिन तथ्य यह है कि यह ConcurrentDictionary की आशावादी समवर्ती निकालें विधि के रूप में दर्ज नहीं किया गया है, इसलिए http://msdn.microsoft.com/en-us/library/dd287153.aspx सिर्फ ICollection बॉयलरप्लेट डुप्लिकेट, और How to: Add and Remove Items from a ConcurrentDictionary या तो है कि विधि का उल्लेख नहीं करता है।

क्या किसी को पता है कि यह जाने का तरीका है, या क्या कोई अन्य तरीका है जिसे मैं याद कर रहा हूं?

+0

सही दिखता है (चूंकि यह वही तरीका है जो 'TryRemove' कॉल है, बस' matchValue' सेट के साथ गलत और 'पुराना वैल्यू' डिफॉल्ट किया गया है) –

+2

हालांकि यह आधिकारिक दस्तावेज़ नहीं है, यह सहायक हो सकता है: http: // ब्लॉग। msdn.com/b/pfxteam/archive/2011/04/02/10149222.aspx – alexm

+0

@alexm यह पर्याप्त आश्वस्त है - यदि आप इसे उत्तर में बदल देते हैं, तो मैं इसे स्वीकार करूंगा! एमएस वास्तव में अपने दस्तावेज़ीकरण को अद्यतन करना चाहिए, अगर यह सच है कि हाल ही में उन्होंने "कई लोगों को ConcurrentDictionary पर और समर्थन के लिए कहा है" देखा है ... –

उत्तर

4

हालांकि यह एक आधिकारिक दस्तावेज नहीं है, this MSDN blog post सहायक हो सकता है। उस आलेख का सारांश: ICollection पर कास्टिंग और Remove विधि को कॉल करना, जैसा कि प्रश्न में वर्णित है, जाने का तरीका है।

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

आप सभी की घंटी ConcurrentDictionary की & सीटी की जरूरत नहीं है, तो आप सिर्फ अपने प्रकार के रूप में घोषणा कर सकते हैं:

यहाँ ऊपर ब्लॉग पोस्ट से एक टुकड़ा है, जो इसे एक TryRemove विस्तार तरीकों में लपेटता है एक आईडीकीर

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

मैं स्थिति है जिसमें आप केवल जोड़ सकते हैं और दूर करने के लिए की जरूरत है इस उपयोगी पाते हैं, लेकिन अभी भी एक धागे की सुरक्षित यात्रा चाहते हैं।

+0

यदि परिदृश्य में आप परिदृश्य का उपयोग करेंगे, लेकिन इसकी विशेष विधियों की आवश्यकता नहीं है, तो मैं उनके पास नहीं आया है। लेकिन अगर वहां थे, तो आपका सुझाव निश्चित रूप से अनावश्यक बना देगा। ओह, मुझे यकीन है कि यह एक "संकलन-समय कास्ट" है, इसलिए कोई भी प्रदर्शन जुर्माना नहीं है। बस कुछ हद तक उलझन कोड। –

+0

उस परिदृश्य में जिसे आप शब्दकोश से वस्तुओं को जोड़ना और निकालना चाहते हैं, साथ ही साथ इसे पुनरावृत्त किया जा रहा है। ऐसा होने के नाते ConcurrentDictionary एक महत्वपूर्ण स्नैपशॉट प्रदान करता है, आपको अपवाद नहीं मिलेगा। – greyalien007

संबंधित मुद्दे