समूह बनाने के साथ सूची में एक शब्दकोश बनाएं


106

मेरे पास सूची में निम्नलिखित वस्तु है:

public class DemoClass
{
    public int GroupKey { get; set; }
    public string DemoString { get; set; }
    public object SomeOtherProperty { get; set; }
}

अब, मैं इसमें से निम्नलिखित शब्दकोश बनाना चाहता हूं:

Dictionary<int, List<DemoClass>>

मैं List<DemoClass>संपत्ति के आधार पर समूह बनाना चाहता हूं GroupKey, लेकिन मुझे समझ नहीं आता कि यह कैसे किया जाता है और कुछ मदद करता है।

थोड़ा सोचने के बाद, मैंने इसके साथ आवश्यक व्यवहार हासिल किया:

var groupedDemoClasses = from demoClass in mySepcialVariableWhichIsAListOfDemoClass
                            group demoClass by demoClass.GroupKey
                            into groupedDemoClass
                            select groupedDemoClass;
var neededDictionary = groupedDemoClass.ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

लेकिन, वहाँ एक बयान में यह करने के लिए एक रास्ता है?

जवाबों:



198

बस mquander के सुझाव को ठोस बनाने के लिए :

var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                             .GroupBy(x => x.GroupKey)
                             .ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

यदि आप छोटे चर नामों का भी उपयोग करते हैं तो आप इसे कम कर देंगे, निश्चित रूप से :)

हालाँकि, क्या मैं सुझाव दे सकता हूं कि एक लुकअप अधिक उपयुक्त हो सकता है? एक लुकअप मूल रूप से एक कुंजी से एक शब्दकोश है IEnumerable<T>- जब तक आपको वास्तव में एक सूची के रूप में मूल्यों की आवश्यकता नहीं होती है, यह कोड को टोलूकूप कॉल के साथ कम (और अधिक कुशल) बनाता है :

var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                             .ToLookup(x => x.GroupKey);

1
मैंने सोचा था कि एक लुकअप एक लंबे शब्दकोश-वातावरण की तुलना में एक अच्छे शब्दकोश का निर्माण नहीं करता है, क्योंकि यह हर अनुरोध के लिए परिणाम को ताजा बनाता है ... कृपया मुझे सही करें, अगर मैं गलत हूं!
एंड्रियास निडरमेयर

नहीं, यह संपूर्ण लुकअप बनाता है। सामान्य तौर पर, ToXXX स्थगित निष्पादन का उपयोग नहीं करता है।
जॉन स्कीट

1
(आप एक ग्रुपिंग के बारे में सोच रहे होंगे, जो वास्तव में स्थगित है।)
जॉन स्कीट

1
अगर मैं इतना संयमी नहीं होता तो मैं आपको वोट देता। Linq के लिए आया था, मैं कभी नहीं सुना है डेटा संरचना के लिए रुके!
क्रिस मैककॉल

2
@sasikt: मॉडल यह है कि आप कुछ भी देख सकते हैं , और यदि कुंजी मौजूद नहीं है, तो आपको बस एक खाली संग्रह मिलता है। यह अक्सर TryGetValue दृष्टिकोण, IMO से अधिक उपयोगी है।
जॉन स्कीट

6

आपने पहले ही इसे वन-लाइनर बना दिया था। बस ToDictionaryअपनी पहली पंक्ति के अंत में रखें। यदि आप इसे छोटा करना चाहते हैं, तो क्वेरी सिंटैक्स के बजाय कार्यात्मक संरचना सिंटैक्स का उपयोग करें।


3

मैं यहाँ विषय से थोड़ा दूर जा रहा हूँ , लेकिन मुझे यह धागा मिल गया है क्योंकि मैं लाइनक में एक शब्दकोश का एक शब्दकोश बनाने के लिए एक रास्ता तलाश रहा था, और यहाँ बातचीत मुझे उत्तर की ओर ले जाती है ...

आप बहु-स्तरीय शब्दकोशों बनाने के लिए linq का उपयोग कर सकते हैं, जो उन परिदृश्यों के लिए उपयोगी है जहाँ आपको 1 से अधिक कुंजी या आयाम मिले हैं जिन्हें आप खोज करना चाहते हैं। ट्रिक एक समूह बनाने और फिर इसे एक शब्दकोश में बदलने के लिए है, इस प्रकार है:

  Dim qry = (From acs In ActualSales _
             Group By acs.ProductID Into Group _
             Select ProductID, Months = Group.ToDictionary(Function(c) c.Period) _
            ).ToDictionary(Function(c) c.ProductID)

परिणामस्वरूप क्वेरी का उपयोग निम्नानुसार किया जा सकता है:

 If qry.ContainsKey(_ProductID) Then
      With qry(_ProductID)
          If .Months.ContainsKey(_Period) Then
             ...
          End If
      End With
 End If

आशा है कि यह किसी और के लिए सहायक है, जिसे इस प्रकार की क्वेरी की आवश्यकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.