LINQ - मूल्य के रूप में सूची के साथ सूची को शब्दकोश में बदलें


99

मेरे पास एक

List<MyObject> 

कि मैं डेटाबेस से पुनः प्राप्त करता हूं। हालाँकि, मैं चाहूंगा कि यह MyObject में ग्रुपिंग के उद्देश्य से एक प्रॉपर्टी के द्वारा दिया जाए। मेरी सूची में डालने के लिए LINQ के साथ सबसे अच्छा तरीका क्या है:

Dictionary<long, List<MyObject>>

मेरे पास निम्नलिखित हैं:

myObjectList.ToDictionary(x => x.KeyedProperty)

लेकिन यह रिटर्न:

Dictionary<long, MyObject>

आप चाहते हैं कि शब्दकोश WHO MyObject की एक उचित को बंद कर दिया जाए। - आपके पास उनकी पूरी सूची है ....
जेम्स कर्रान

जवाबों:


191

ऐसा लगता है कि आप MyObjectउदाहरणों को समूहबद्ध करना चाहते हैं KeyedPropertyऔर उस समूह को एक में डाल दें Dictionary<long,List<MyObject>>। यदि ऐसा है तो निम्न प्रयास करें

List<MyObject> list = ...;
var map = list
  .GroupBy(x => x.KeyedProperty)
  .ToDictionary(x => x.Key, x => x.ToList());

16

आपको कक्षा पर ToLookupविस्तार विधि का उपयोग करना चाहिए जैसे:Enumerable

List<MyObject> list = ...;

ILookup<long, MyObject> lookup = list.ToLookup(o => o.KeyedProperty);

यदि आप उसे किसी शब्दकोश में रखना चाहते हैं, तो आप ToDictionaryविस्तार विधि का उपयोग कर सकते हैं , जैसे:

IDictionary<long, IEnumerable<MyObject>> dictionary = lookup.ToDictionary(
    l => l.Key);

इस और स्वीकृत उत्तर में क्या अंतर है? क्या ILookupसंदर्भों को संरक्षित करता है जबकि स्वीकृत उत्तर नहीं देता है?
पैटपेटर

@PatPeter यह विचार है कि जब आपके पास कुंजी और वस्तुओं के बीच एक-से-कई संबंध हैं, Lookup<TKey, TValue>तो एक से बेहतर संरचना हो सकती है Dictionary<TKey, TValue>
कैस्परऑन

1
@PatPeter मैं कहूंगा कि ILookup का उपयोग करने के लिए बेहतर संरचना है (यह मल्टीमैप से तानाशाह के नक्शे की तरह है, यदि आप C ++ संग्रह एल्गोरिदम को जानते हैं), लेकिन इसके ध्यान में रखने के लिए एक बड़ा कारक है - बनाई गई लुक अपूरणीय है। आप बाद में प्रविष्टियों को जोड़ या हटा नहीं सकते।
gbjbaanb

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