LINQ

2009-03-06 10 views
138

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

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

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

क्या यह संभव है, या मुझे इसे कई चरणों में करने की ज़रूरत है?

धन्यवाद।

उत्तर

221

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

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] मूल्य "हैलो"

+3

+1 Whuh। यह नई डेटा ऑब्जेक्ट्स बनाने के तरीके पर नई संभावनाएं खुलता है। – Sung

+1

बहुत बढ़िया, खुशी है कि आप इसका उपयोग करेंगे, मुझे पता है कि इससे कुछ स्थितियों में मेरी मदद मिली है। –

+2

Egads! यह अब 2017 है और मुझे केवल इस बारे में पता चला !! –

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

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

+21

'.ToDictionary (item => item.prop1, item => item.prop2); 'स्पष्टीकरण के लिए मूल्य भी सेट करें। – finoutlook

11

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

Dictionary<int, string> dictionary = objects 
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name)) 
    .ToDictionary(x=>x.Key, x=>x.Value); 
संबंधित मुद्दे