2012-07-20 15 views
58

यह एक अजीब चीज प्रतीत हो सकती है जो करना चाहते हैं लेकिन इसे अनदेखा कर रहा है, क्या एक सूची में शब्दकोश को परिवर्तित करने का एक अच्छा संक्षिप्त तरीका है जहां शब्दकोश में प्रत्येक कुंजी मूल्य जोड़ी है सूची में प्रत्येक स्ट्रिंग। अर्थातसी # कन्वर्ट सूची <string> शब्दकोश में <स्ट्रिंग, स्ट्रिंग>

List = string1, string2, string3 
Dictionary = string1/string1, string2/string2, string3/string3 

मैं खोज के बहुत सारे किया है और वहाँ सचमुच विपरीत दिशा में यह ऐसा करने का अकेला नहीं बल्कि इस तरह से दौर Stackoverflow पर हैं उदाहरण के दर्जनों।

ऐसा करने का कारण यह है कि मेरे पास दो तिहाई भाग घटक हैं और उन्हें बदलना मेरे हाथों से बाहर है। एक सूची के रूप में ईमेल पते की एक सूची देता है और दूसरा ईमेल भेजता है जहां पैरामीटर एक शब्दकोश है। शब्दकोश की कुंजी ईमेल पता है और मूल्य उनका वास्तविक नाम है। हालांकि, मुझे असली नाम नहीं पता है लेकिन यह तब भी काम करता है जब आप असली नाम ईमेल पते पर भी सेट करते हैं। इसलिए मैं एक सूची को एक शब्दकोश में क्यों परिवर्तित करना चाहता हूं। ऐसा करने के कई तरीके हैं। सूची में एक foreach पाश जो एक शब्दकोश के लिए एक केवीपी जोड़ता है। लेकिन मुझे terse कोड पसंद है और आश्चर्य हुआ कि क्या एक लाइन समाधान था।

+1

मैं अपने वैध कारण के लिए एक बेहतर समाधान, ईमानदार है। – Will

+2

आप यह देखना चाहेंगे कि हैशसेट <> शब्दकोश <,> का उपयोग करने के बजाय आपकी आवश्यकताओं को पूरा करता है या नहीं। – Greg

+0

उपर्युक्त टिप्पणीकर्ताओं से अधिक सीधे: यदि आप इसे पाने के लिए अपना कारण बताते हैं, तो शायद कोई बेहतर समाधान सुझा सकता है। –

उत्तर

124

इस प्रयास करें:

var res = list.ToDictionary(x => x, x => x); 

पहले लैम्ब्डा दूसरा एक मूल्य उठाता है, आप कुंजी चुनने देती है।

आप इसे साथ खेलते हैं और मान इस तरह, कुंजी से अलग कर सकते हैं: अपनी सूची डुप्लिकेट शामिल

var res = list.ToDictionary(x => x, x => string.Format("Val: {0}", x)); 

हैं, तो इस तरह Distinct() जोड़ें:

var res = list.Distinct().ToDictionary(x => x, x => x); 

संपादित टिप्पणी करने के लिए वैध कारण पर, मुझे लगता है कि इस तरह के रूपांतरणों के लिए वैध एकमात्र कारण यह है कि किसी बिंदु पर परिणामस्वरूप शब्दकोश में कुंजी और मान अलग-अलग हो जाएंगे। उदाहरण के लिए, आप प्रारंभिक रूपांतरण करेंगे, और उसके बाद कुछ मूल्यों को किसी और चीज़ से प्रतिस्थापित करेंगे। कुंजी और मूल्यों हमेशा एक ही होने जा रहा है, तो HashSet<String> एक बेहतर अपनी स्थिति के लिए फिट प्रदान करेगा:

var res = new HashSet<string>(list); 
if (res.Contains("string1")) ... 
+0

करने के लिए एक सूची कन्वर्ट करने के लिए इस असफल हो जायेगी अगर सूची string1, string2, string3, string1 –

+3

@PranayRana की तरह है हाँ चाहते हो सकता है , यह होगा। इससे बचने के लिए आप 'सूची' के बाद 'डिस्टिंक()' जोड़ सकते हैं। – dasblinkenlight

+0

धन्यवाद। मुझे ToDictionary फ़ंक्शन याद आया। उन सभी के लिए धन्यवाद जिन्होंने मूल रूप से एक ही जवाब दिया था। मैंने सभी को उखाड़ फेंक दिया लेकिन केवल एक जवाब स्वीकार कर सकता हूं। यह एक अलग कोड जोड़ा गया था, इसलिए मेरी राय में सबसे पूर्ण था। – Jonnster

7

इस का उपयोग करें:

var dict = list.ToDictionary(x => x); 

अधिक जानकारी के लिए MSDN देखें।

जैसा कि प्राणय टिप्पणियों में बताते हैं, यह सूची विफल हो जाएगी यदि सूची में कोई आइटम मौजूद है।
अपने विशिष्ट आवश्यकताओं के आधार पर, आप या तो var dict = list.Distinct().ToDictionary(x => x); का उपयोग अलग मदों की एक शब्दकोश पाने के लिए कर सकते हैं या आप ToLookup बजाय का उपयोग कर सकते हैं:

var dict = list.ToLookup(x => x); 

यह एक ILookup<string, string> जो अनिवार्य रूप से IDictionary<string, IEnumerable<string>> रूप में ही है वापस आ जाएगी, तो आप करेंगे इसके अंतर्गत प्रत्येक स्ट्रिंग उदाहरण के साथ अलग-अलग कुंजियों की एक सूची है।

+0

यह सूची विफल हो जाएगी यदि सूची स्ट्रिंग 1, स्ट्रिंग 2, स्ट्रिंग 3, स्ट्रिंग 1 –

+0

@PranayRana की तरह है: आप सही हैं। ठीक कर दिया। –

1

ToDictionary का उपयोग करके:

var dictionary = list.ToDictionary(s => s); 

तो यह संभव है कि कोई भी स्ट्रिंग दोहराया जा सकता है, या तो पहली सूची पर एक Distinct कॉल कर (डुप्लिकेट को निकालने के), या ToLookup जो प्रति एक से अधिक मान के लिए अनुमति देता का उपयोग कुंजी।

0

संपादित

डुप्लिकेट से निपटने के लिए आप इस

var dic = slist.Select((element, index)=> new{element,index}) 
      .ToDictionary(ele=>ele.index.ToString(), ele=>ele.element); 

या


आसान करने के लिए जिस तरह से की तरह कर सकते हैं का एक अन्य तरीका

var res = list.ToDictionary(str => str, str=> str); 
है

लेकिन सुनिश्चित करें कि कोई स्ट्रिंग दोहरा रहा है है कि वहाँ बनाने ... फिर otherewise ऊपर कोड के लिए आप

काम नहीं करेगा अगर वहाँ स्ट्रिंग है इसके बेहतर दोहरा इस

Dictionary<string,string> dic= new Dictionary<string,string>(); 

    foreach(string s in Stringlist) 
    { 
     if(!dic.ContainsKey(s)) 
     { 
     // dic.Add(value to dictionary 
     } 
    } 
की तरह करना है
-1

आप उपयोग कर सकते हैं:

var dictionary = myList.ToDictionary(x => x); 
संबंधित मुद्दे