LINQ Group एक Dictionary Object में जाकर


161

मैं एक Dictionary<string, List<CustomObject>>से बनाने के लिए LINQ का उपयोग करने की कोशिश कर रहा हूँ List<CustomObject>। मैं इसे "var" का उपयोग करके काम करने के लिए प्राप्त कर सकता हूं, लेकिन मैं अनाम प्रकारों का उपयोग नहीं करना चाहता। यही सब कुछ मेरे पास है

var x = (from CustomObject o in ListOfCustomObjects
      group o by o.PropertyName into t
      select t.ToList());

मैंने Cast<>()एक बार LINQ लाइब्रेरी का उपयोग करने की भी कोशिश की है x, लेकिन मुझे इसके अवैध संकलन होने के कारण संकलन की समस्याएँ हैं।


यदि आप var x का प्रयास करते हैं = (CustomObject o से ListOfCustomObjects समूह o द्वारा o.PropertyName में t select t) .ToList ();
esastincy

44
क्या कोई कारण है कि आपको ToLookup का उपयोग करने के बजाय ऐसा करने की आवश्यकता है, जिसे इसके लिए डिज़ाइन किया गया है?
जॉन स्कीट

1
जॉन, क्या आप कृपया एक उदाहरण पोस्ट कर सकते हैं कि कैसे ToLookup इस स्थिति में काम करता है? मैं उस LINQ विधि से परिचित नहीं हूँ।
अटारी2600

8
@JonSkeet तुम कमाल हो! (मेरा मतलब है, हर कोई जानता था कि पहले से ही, लेकिन फिर भी।) क्योंकि मैं ToLookup का उपयोग करने की योजना नहीं बना रहा था, इसका कारण था कि मैंने अब तक इसके बारे में कभी नहीं सुना। अब मुझे पता है!
नीमनीम

1
पूर्णता के लिए, var"अनाम" प्रकार का उपयोग नहीं कर रहा है, यह "निहित" प्रकार का उपयोग कर रहा है। अनाम प्रकार निर्माण को संभालने के लिए संकलक द्वारा बनाई गई नई कक्षाएं हैं new { thing = "stuff" };। निहित प्रकार मौजूदा कक्षाएं हैं, varबस उन्हें संदर्भित करने के लिए एक सुविधाजनक तरीका है जब चर को तुरंत सौंपा जा रहा है, चर प्रकार को उस वस्तु के प्रकार से अनुमान लगाया जा सकता है जिसे उसे सौंपा जा रहा है। आप एक अनाम प्रकार का संदर्भ देते हुए एक चर भी कह सकते हैं, जैसे:var a = new { thing = "stuff" };
माइकल ब्लैकबर्न

जवाबों:


351
Dictionary<string, List<CustomObject>> myDictionary = ListOfCustomObjects
    .GroupBy(o => o.PropertyName)
    .ToDictionary(g => g.Key, g => g.ToList());

6
जब तक आपको सूची के मान के रूप में 'CustomObject' से एक संपत्ति की आवश्यकता होती है (इस उत्तर में नहीं दिखाया गया है) यह ToLookup () की सिफारिश करने के सवाल पर उसकी कोडेलिटी जॉन स्कीट की टिप्पणी की जाँच करने के लायक है।
शॉन

3
यदि गैर अपरिवर्तनीय परिणाम वांछित है, तो ऐसा करने का यह तरीका है। ToLookup अपरिवर्तनीय है।
अमित

1
मेरे 2 सेंट (सिर्फ इस कारण से मुझे एक घंटे के लिए संघर्ष करना पड़ा :)): जब एक संपत्ति का समूह बनाते हैं, तो सुनिश्चित करें कि संपत्ति एक मूल्य है! अन्यथा टोडिक-पद्धति कुंजी उत्पन्न करने में विफल रहती है (स्ट्रिंग-गुणों के लिए कम से कम ...) :)
dba

.GroupBy(o => o.PropertyName).ToDictionary(g => g.Key, g => g.ToList())यह विस्तार Linq पुस्तकालय का एक हिस्सा हो सकता है। इसलिए हमें केवल करना है.ToDictionary(o=>o.PropertyName)
जैडर

3
@ जैदर, पहले से ही ऐसी कार्यक्षमता है: बस के ToDictionaryसाथ बदलें ToLookup
रॉबर्ट सिनोरैडज़की

19

मैं @ मिचेल ब्लैकबर्न पर टिप्पणी नहीं कर सकता, लेकिन मुझे लगता है कि आपको डाउनवोट मिला क्योंकि इस मामले में ग्रुपबी आवश्यक नहीं है।

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

var lookupOfCustomObjects = listOfCustomObjects.ToLookup(o=>o.PropertyName);
var listWithAllCustomObjectsWithPropertyName = lookupOfCustomObjects[propertyName]

इसके अतिरिक्त, मैंने इस प्रदर्शन को GroupBy ()। To मंदार () का उपयोग करने से बेहतर तरीके से देखा है।


मैं एक लिप्यंतरण कर रहा था, सर्वोत्तम तरीके से प्रश्न का उत्तर नहीं दे रहा था।
माइकल ब्लैकबर्न

1

@ Atari2600 के लिए, यह वही है जो लैंबडा सिंटैक्स में ToLookup का उपयोग करने पर दिखेगा।

var x = listOfCustomObjects
    .GroupBy(o => o.PropertyName)
    .ToLookup(customObject => customObject);

मूल रूप से, यह IGrouping लेता है और इसे सूचियों के शब्दकोश में आपके लिए भौतिक रूप देता है, जिसमें प्रमुख के रूप में PropertyName के मूल्यों के साथ है।


एक डाउनवोट क्यों? क्या यह सवाल का सटीक / उत्तर नहीं है?
माइकल ब्लैकबर्न

1
यदि आपने इसे याद किया है, तो @RuudvK ने अपने उत्तर में उल्लेख किया कि उन्हें संदेह है कि ग्रुपबी अनावश्यक है। ToLookupएक अधिभार है कि काम मिल जाएगा।
जेफ बी

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

GroupBy (केवल एक पैरामीटर के साथ अधिभार) एक IEnumerable देता है <IGrouping <TKey, TSource >> बाद में ToLookup, फिर इसे एक बहुत ही जटिल प्रकार में बदल देता है जो IDEDIA <TKey, IList <TSource >> बस ToLookup के समान नहीं है उचित प्रकार देता है।
xtofs

-1

निम्नलिखित ने मेरे लिए काम किया।

var temp = ctx.Set<DbTable>()
  .GroupBy(g => new { g.id })
  .ToDictionary(d => d.Key.id);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.