LINQ वाला डिक्शनरी <T1, T2> सेलेक्ट करें


171

मैंने IEnumerable<T>LINQ के साथ लौटने के लिए "select" कीवर्ड और एक्सटेंशन विधि का उपयोग किया है, लेकिन मुझे एक जेनेरिक को वापस करने की आवश्यकता है Dictionary<T1, T2>और यह पता नहीं लगा सकता। उदाहरण मैं इसे कुछ इसी तरह के रूप में इस्तेमाल किया से सीखा है:

IEnumerable<T> coll = from x in y 
    select new SomeClass{ prop1 = value1, prop2 = value2 };

मैंने विस्तार विधियों के साथ भी यही काम किया है। मैंने यह माना कि चूंकि आइटम में Dictionary<T1, T2>आइटर्नेट किया जा सकता है क्योंकि KeyValuePair<T1, T2>मैं उपरोक्त उदाहरण में "SomeClass" को " new KeyValuePair<T1, T2> { ..." के साथ बदल सकता हूं , लेकिन यह काम नहीं किया (कुंजी और मान को आसानी से चिह्नित किया गया था, इसलिए मैं इस कोड को संकलित नहीं कर सका। )।

क्या यह संभव है, या क्या मुझे कई चरणों में ऐसा करने की आवश्यकता है?

धन्यवाद।

जवाबों:


284

एक्सटेंशन के तरीके भी एक टोबैडो एक्सटेंशन प्रदान करते हैं । यह उपयोग करने के लिए काफी सरल है, सामान्य उपयोग कुंजी के लिए एक लैम्ब्डा चयनकर्ता पास कर रहा है और मूल्य के रूप में ऑब्जेक्ट प्राप्त कर रहा है, लेकिन आप कुंजी और मूल्य दोनों के लिए एक लैम्ब्डा चयनकर्ता पास कर सकते हैं।

class SomeObject
{
    public int ID { get; set; }
    public string Name { get; set; }
}

SomeObject[] objects = new SomeObject[]
{
    new SomeObject { ID = 1, Name = "Hello" },
    new SomeObject { ID = 2, Name = "World" }
};

Dictionary<int, string> objectDictionary = objects.ToDictionary(o => o.ID, o => o.Name);

तब आपको objectDictionary[1]"हैलो" मान मिलेगा


44
var dictionary = (from x in y 
                  select new SomeClass
                  {
                      prop1 = value1,
                      prop2 = value2
                  }
                  ).ToDictionary(item => item.prop1);

यह मानते हुए कि शब्दकोश के लिए SomeClass.prop1वांछित है Key


27
.ToDictionary(item => item.prop1, item => item.prop2);अन्वेषण करने के लिए मूल्य भी निर्धारित किया है।
finoutlook

42

का एक संग्रह और KeyValuePairभी अधिक स्पष्ट है, और बहुत अच्छी तरह से निष्पादित करता है।

Dictionary<int, string> dictionary = objects
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name))
    .ToDictionary(x=>x.Key, x=>x.Value);

क्या इसे दूर करना संभव है। टेडोमीटर (x => x.Key, x => x.Value); और नए KeyValuePair को नए शब्दकोश से बदलें?
अमीर हाजी

@ अमीरो-परिवार तुम गलत समझ रहे हो। चयन करें (x => x ...) विधि ऑब्जेक्ट संग्रह के प्रत्येक तत्व के लिए एक प्रक्षेपण प्रदर्शन करते हैं । इसलिए नए KeyValuePair को नए डिसेक्शनरी के साथ बदलने से शब्दकोशों का एक शब्दकोश तैयार होगा। मुझे नहीं लगता कि आप यही लक्ष्य कर रहे हैं।
एंटोनी मेल्टज़ाइम

मेरे पास डिक्शनरी <स्ट्रिंग, स्ट्रिंग> की एक सूची है और उन पर चयन का उपयोग करने की कोशिश कर रहा था लेकिन यह एक संकलन त्रुटि फेंकता है।
अमीर हाजी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.