C # कन्वर्ट सूची <string> से शब्दकोश <string> स्ट्रिंग>


117

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

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

मैंने बहुत खोज की है और स्टैकओवरफ्लो पर वस्तुतः दर्जनों उदाहरण हैं जो इसे विपरीत दिशा में कर रहे हैं लेकिन इस तरह से गोल नहीं हैं।

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


1
मेरे पास आपके वैध कारण, ईमानदार के लिए बेहतर समाधान है।

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

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

1
कोई बेहतर उपाय नहीं है। मेरे पास एक थर्ड पार्टी कंपोनेंट है, जो इन ईमेल पतों के तार की सूची लौटाता है। मेरे पास एक और तृतीय पक्ष घटक है जो ईमेल भेजता है जहां यह एक शब्दकोश <string, string> पास करता है जहां कुंजी ईमेल पता है और मान प्राप्तकर्ताओं का वास्तविक नाम है। हालाँकि, असली नाम फिर से केवल ईमेल पता हो सकता है, यही वजह है कि मैं सूची <string> को एक डिक्शनरी में बदलना चाहता हूं <string, string>
Jonnster

जवाबों:


243

इसे इस्तेमाल करे:

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

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

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

यह विफल हो जाएगा अगर सूची string1, string2, string3, string1 जैसी है
प्रणय राणा

3
@PranayRana हाँ, यह होगा। इससे बचने के .Distinct()बाद आप जोड़ सकते हैं list
डेसब्लिंकनेलाइट

धन्यवाद। मैं टूडू फंक्शन से चूक गया। उन सभी को धन्यवाद जिन्होंने मूल रूप से एक ही जवाब दिया। मैंने सभी को उकसाया लेकिन केवल एक उत्तर को स्वीकार कर सकता हूं। यह केवल डिस्टिंक कोड के साथ एक था, इसलिए मेरी राय में यह सबसे पूर्ण था।
जॉनस्टर

11

इसे इस्तेमाल करो:

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>>, इसलिए आपके पास इसके तहत प्रत्येक स्ट्रिंग उदाहरण के साथ अलग-अलग कुंजी की एक सूची होगी।


यह विफल हो जाएगा अगर सूची string1, string2, string3, string1 जैसी है
प्रणय राणा

1

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

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

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


0

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

var dictionary = myList.ToDictionary(x => x);

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

लेकिन सुनिश्चित करें कि कोई स्ट्रिंग नहीं दोहरा रहा है ... फिर से कोड के ऊपर अन्य आपके लिए काम नहीं करेगा

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

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

    foreach(string s in Stringlist)
    {
       if(!dic.ContainsKey(s))
       {
        //  dic.Add( value to dictionary
      }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.