2012-09-12 15 views
6

मेरे पास ArrayPerson ऑब्जेक्ट है और मैं इसे ConcurrentDictionary में परिवर्तित करना चाहता हूं। Array को Dictionary में परिवर्तित करने के लिए एक्सटेंशन विधि है। Array को ConcurrentDictionary में परिवर्तित करने के लिए कोई एक्सटेंशन विधि है?linq या IEnumarable का उपयोग कर सरणी को समवर्ती शब्दकोश में कनवर्ट करने का कोई बेहतर तरीका?

public class Person 
{ 
    public Person(string name, int age) 
    { 
     Name =name; 
     Age = age; 
    } 

    public string Name { get; set; } 
    public int Age { get; set; } 
} 

Dictionary<int, Person> PersonDictionary = new Dictionary<int, Person>(); 
Person[] PersonArray = new Person[] 
{ 
    new Person("AAA", 30), 
    new Person("BBB", 25), 
    new Person("CCC",2), 
    new Person("DDD", 1) 
}; 

PersonDictionary = PersonArray.ToDictionary(person => person.Age); 

एक ConcurrentDictionary के लिए एक Array परिवर्तित करने के लिए किसी भी इसी तरह के विस्तार विधि/लैम्ब्डा अभिव्यक्ति?

var personDictionary = new ConcurrentDictionary<int, Person> 
         (PersonArray.ToDictionary(person => person.Age)); 

varConcurrentDictionary<int,Person> के प्रकार infers:

उत्तर

15

ज़रूर लेता है, निर्माता है कि एक IEnumerable<KeyValuePair<int,Person>> स्वीकार करता है का उपयोग करें।

आप एक विस्तार विधि बनाने के लिए जा रहे हैं, के रूप में ततैया का सुझाव दिया, मैं निम्नलिखित संस्करण है जो कुछ हद तक एक अधिक धाराप्रवाह वाक्यविन्यास प्रदान करता है का उपयोग कर की सिफारिश करेंगे:

public static ConcurrentDictionary<TKey, TValue> ToConcurrentDictionary<TKey, TValue> 
(this IEnumerable<TValue> source, Func<TValue, TKey> valueSelector) 
{ 
    return new ConcurrentDictionary<TKey, TValue> 
       (source.ToDictionary(valueSelector)); 
} 

उपयोग ToDictionary के समान है, बनाने एक सुसंगत महसूस:

var dict = PersonArray.ToConcurrentDictionary(person => person.Age); 
+1

जबकि यह उत्तर मान्य है, [वास्प का उत्तर] (http://stackoverflow.com/a/12396386/1149773) कम्प्यूटेशनल और मेमोरी मांगों के मामले में बेहतर है। इस उत्तर के लिए एक 'शब्दकोश <टीकेई, टेलीमेंट>' की आवश्यकता है, केवल तुरंत त्याग दिया जाना चाहिए। – Douglas

2

एक constructor कि IEnumerable<KeyValuePair<TKey,TValue>>

IDictionary<int,Person> concurrentPersonDictionary = 
    new ConcurrentDictionary<int,Person>(PersonArray.ToDictionary(person => person.Age)); 
9

आप अपनी खुद की विस्तार विधि बहुत आसानी से, उदाहरण के लिए इस तरह के लिख सकते हैं:

public static class DictionaryExtensions 
{ 
    public static ConcurrentDictionary<TKey, TValue> ToConcurrentDictionary<TKey, TValue>(
     this IEnumerable<KeyValuePair<TKey, TValue>> source) 
    { 
     return new ConcurrentDictionary<TKey, TValue>(source); 
    } 

    public static ConcurrentDictionary<TKey, TValue> ToConcurrentDictionary<TKey, TValue>(
     this IEnumerable<TValue> source, Func<TValue, TKey> keySelector) 
    { 
     return new ConcurrentDictionary<TKey, TValue>(
      from v in source 
      select new KeyValuePair<TKey, TValue>(keySelector(v), v)); 
    } 

    public static ConcurrentDictionary<TKey, TElement> ToConcurrentDictionary<TKey, TValue, TElement>(
     this IEnumerable<TValue> source, Func<TValue, TKey> keySelector, Func<TValue, TElement> elementSelector) 
    {    
     return new ConcurrentDictionary<TKey, TElement>(
      from v in source 
      select new KeyValuePair<TKey, TElement>(keySelector(v), elementSelector(v))); 
    } 
} 
+0

यह एक अच्छा सुझाव है, +1। केवल दो मामूली आलोचनाएं: पैरामीटर 'IENumerable > प्रकार का हो सकता है' और मैं 'टीके, टीवीएयू' के मानक नामकरण सम्मेलन का पालन करने का सुझाव देता हूं। – Adam

+0

सहमत हैं, जैसा कि आपने कहा था, टाइप किया जा सकता है, मैं इसे ठीक कर दूंगा। मेरा मुद्दा यह स्पष्ट करने के लिए और अधिक था कि यदि कोई गुम हो, तो एक्सटेंशन एक्सटेंशन को जोड़ना बहुत आसान है। – Wasp

+0

ओह। ऐसा लगता है कि हमारे मन में समान चीजें थीं; मेरा जवाब देखें;) – Adam