2010-12-02 13 views
19

मेरे पास एक ConcurrentDictionary ऑब्जेक्ट है जिसे मैं एक शब्दकोश ऑब्जेक्ट पर सेट करना चाहता हूं।मैं एक ConcurrentDictionary को एक शब्दकोश में कैसे परिवर्तित कर सकता हूं?

उन दोनों के बीच कास्टिंग अनुमति नहीं है। तो मैं इसे कैसे करूं?

उत्तर

31

ConcurrentDictionary<K,V> कक्षा IDictionary<K,V> इंटरफ़ेस लागू करती है, जो अधिकांश आवश्यकताओं के लिए पर्याप्त होनी चाहिए। लेकिन अगर आप वास्तव में एक ठोस Dictionary<K,V> ... जरूरत

var newDictionary = yourConcurrentDictionary.ToDictionary(kvp => kvp.Key, 
                  kvp => kvp.Value, 
                  yourConcurrentDictionary.Comparer); 

// or... 
// substitute your actual key and value types in place of TKey and TValue 
var newDictionary = new Dictionary<TKey, TValue>(yourConcurrentDictionary, yourConcurrentDictionary.Comparer); 
+4

ध्यान दें कि कॉपी करने के लिए शब्दकोश एक गैर-डिफ़ॉल्ट 'IEqualityComparer' का उपयोग कर सकता है जो इस तरह से संरक्षित नहीं होगा! बेहतर: 'var newDict = dict.ToDictionary (kvp => kvp.Key, kvp => kvp.Value, dict.comparer);' –

+2

ध्यान दें कि [MSDN] (https://msdn.microsoft.com/en -us/लाइब्रेरी/system.collections.concurrent (v = vs.110) .aspx) कहता है कि यह थ्रेड सुरक्षित नहीं हो सकता है। आप इसे थ्रेड सुरक्षित कैसे बनाएंगे? – JonDrnek

+0

चिंता न करें, यह वास्तव में ConcurrentDictionary के आधार पर थ्रेड-सुरक्षित है। आपको ConcurrentDictionary की सामग्री का एक स्नैपशॉट मिलेगा। जो शब्द आप उससे प्राप्त करते हैं वह बाद में थ्रेड-सुरक्षित नहीं होगा। – Falanwe

9

आपको इसे एक शब्दकोश में बदलने की आवश्यकता क्यों है? ConcurrentDictionary<K, V>IDictionary<K, V> इंटरफ़ेस लागू करता है, क्या यह पर्याप्त नहीं है?

तुम सच में एक Dictionary<K, V> की जरूरत है, तो आप कॉपी कर सकते हैं यह LINQ का उपयोग कर:

var myDictionary = myConcurrentDictionary.ToDictionary(entry => entry.Key, 
                 entry => entry.Value); 

नोट यह एक कॉपी बनाता है। आप सिर्फ एक शब्दकोश में ConcurrentDictionary असाइन नहीं कर सकते हैं, क्योंकि ConcurrentDictionary शब्दकोश का उप-प्रकार नहीं है। यह IDictionary जैसे इंटरफेस का पूरा बिंदु है: आप कंक्रीट कार्यान्वयन (समवर्ती/गैर-समवर्ती हैशप) से वांछित इंटरफ़ेस ("किसी प्रकार का शब्दकोश") को दूर कर सकते हैं।

0
ConcurrentDictionary<int, string> cd = new ConcurrentDictionary<int, string>(); 
Dictionary<int,string> d = cd.ToDictionary(pair => pair.Key, pair => pair.Value); 
3

मुझे लगता है कि मैं यह करने के लिए एक रास्ता मिल गया है।

ConcurrentDictionary<int, int> concDict= new ConcurrentDictionary<int, int>(); 
Dictionary dict= new Dictionary<int, int>(concDict); 
संबंधित मुद्दे

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