2010-09-16 16 views
7

कृपया मुझे सलाह दी जा सकती है कि शब्दकोशों के शब्दकोश, और/या सूची का शब्दकोश कैसे पूछें?शब्दकोशों का एक शब्दकोश पूछें?

private Dictionary<string, Dictionary<DateTime, double>> masterDict= new Dictionary<string, Dictionary<DateTime, double>>(); 

Private Dictionary<string, List<DateTime>> masterList= new Dictionary<string, List<DateTime>>(); 

मैं अगर मैं निम्नलिखित करते हैं, मैं शब्दकोशों masterDict में निहित की एक सूची प्राप्त पता है, लेकिन मुझे यकीन है कि कैसे उन शब्दकोशों के मूल्यों पर प्राप्त करने के लिए नहीं कर रहा हूँ।

foreach (var kvp in masterDictMethod()) 
     { 
      Console.WriteLine("Key = {0}, Value = {1}", 
       kvp.Key, kvp.Value); 
     } 

देख के लिए धन्यवाद;)

उत्तर

5

आप में foreach kvp.Value, हर masterDict प्रविष्टि यानी Dictionary<DateTime, double>

तो की अंदरूनी शब्दकोश है सिर्फ kvp.Value से अधिक भी foreach और आप करेंगे आंतरिक मूल्य प्राप्त करें।

उदा।

foreach (var kvp1 in masterDictMethod()) 
{ 
    Console.WriteLine("Key = {0}, Inner Dict:", kvp1.Key); 
    foreach (var kvp2 in kvp1.Value) 
    { 
     Console.WriteLine("Date = {0}, Double = {1}", kvp2.Key, kvp2.Value); 
    } 
} 
+0

बिल्कुल सही। धन्यवाद। – Brian

0
foreach (var key in masterDict.Keys) 
{ 
    var nestedDict = masterDict[key]; 
} 
+0

करना बेहतर होगा: 'foreach (मास्टरडिक्ट में var kv) {/ * kv.Value के साथ काम - आंतरिक निर्देश। * /} '। यह आंतरिक लुकअप को बचाता है ('शब्दकोश ' लागू करता है 'IENumerable > '।) – Richard

1

यह एक है:

var masterDictionary = new Dictionary<string, Dictionary<DateTime, double>>(); 

var query = 
    from kvp1 in masterDictionary 
    from kvp2 in kvp1.Value 
    select new {TheString = kvp1.Key, TheDate = kvp2.Key, TheDouble = kvp2.Value }; 

foreach(var x in query) 
{ 
    Console.WriteLine("{0} {1} {2}", x.TheString, x.TheDate, x.TheDouble); 
} 

और फिर अन्य एक है:

var masterList= new Dictionary<string, List<DateTime>>(); 

var query = 
    from kvp in masterList 
    from val in kvp.Value 
    select new {TheString = kvp.Key, TheDate = val); 

foreach(var x in query) 
{ 
    Console.WriteLine("{0} {1}", x.TheString, x.TheDate); 
} 
+0

क्या आप जानते हैं कि क्वेरी के बजाय एक्सटेंशन विधियों द्वारा ऐसा किया जाता है? – mggSoft

+1

@MGG_Soft हां, आप संख्यात्मक के चयन के लिए देख रहे हैं। चयन करें –

0

आप सूचियों शब्दकोशों और अन्य शब्दकोशों युक्त शब्दकोशों के बारे में पूछा।

मैं एक इसी तरह के विषय हाल ही में, जहां मैं एक queryable शब्दकोश (यानी एक विस्तार विधि है जो लैम्ब्डा पैरामीटर के रूप में एक प्रश्न अभिव्यक्ति पारित करने के लिए अनुमति देता है) करना चाहते थे किया था, कि आप की तरह उपयोग कर सकते हैं:

var result = myDictionary.QueryDictionary(w => myList.Any(a => a == w.Key)); 

इस कोड लाइन का उद्देश्य यह जांचना है कि शब्दकोश की कोई भी कुंजी मेरी सूची में निहित है या नहीं।

// extension method using lambda parameters 
public static Dictionary<string, T> QueryDictionary<T>(
    this Dictionary<string, T> myDict, 
    Expression<Func<KeyValuePair<string,T>, bool>> fnLambda) 
{ 
    return myDict.AsQueryable().Where(fnLambda).ToDictionary(t => t.Key, t => t.Value); 
} 

यह हर शब्दकोश किस प्रकार string और हर ऑब्जेक्ट प्रकार T की मदों की कुंजी है के लिए इस्तेमाल किया जा सकता है:

तो मैं क्या किया यह है, मैं निम्नलिखित विस्तार विधि लिखा था।

अब आप आसानी से एक लैम्ब्डा अभिव्यक्ति गुजर, निम्न उदाहरण में से प्रश्नों लिख सकते हैं:

var list1 = new List<string>() { "a", "b" }; 
var myDict = new Dictionary<string, object>(); 
myDict.Add("a", "123"); myDict.Add("b", "456"); myDict.Add("c", "789"); 

var result = myDict.QueryDictionary(w => list1.Any(a => a == w.Key)); 

परिणाम, आइटम ए और बी में शामिल होंगे, क्योंकि वे List1 में शामिल हैं।

तुम भी शब्दकोशों के शब्दकोश क्वेरी कर सकता है, यहाँ LinqPad के लिए एक सी # उदाहरण है, लेकिन यह (बस .Dump() बयान टिप्पणी और उन्हें Console.WriteLine(...) बयान की जगह) एक सांत्वना आवेदन के रूप में इस्तेमाल किया जा सकता के रूप में अच्छी तरह से:

void Main() 
{ 
    // *** Set up some data structures to be used later *** 
    var list1 = new List<string>() { "a", "b", "d" }; // a list 
    var myDict = new Dictionary<string, object>(); // the dictionary 
    myDict.Add("a", "123"); myDict.Add("b", "456"); myDict.Add("c", "789"); 

    var myDict2 = new Dictionary<string, object>(); // 2nd dictionary 
    myDict2.Add("a", "123"); myDict2.Add("b", "456"); myDict2.Add("c", "789"); 

    myDict.Add("d", myDict2); // add 2nd to first dictionary 

    // *** 1. simple query on dictionary myDict *** 
    var q1 = myDict.QueryDictionary(w => list1.Any(a => a == w.Key)); 
    q1.Dump(); 

    // *** 2. query dictionary of dictionary (q3 contains result) *** 
    var q2 = 
     (Dictionary<string, object>)q1.QueryDictionary(w => w.Key.Equals("d")).First().Value; 
    var q3 = q2.QueryDictionary(w => w.Key.Equals("b")); 
    q3.Dump(); 
} 

// *** Extension method 'QueryDictionary' used in code above *** 
public static class Extensions 
{ 
    public static Dictionary<string, T> QueryDictionary<T>(
     this Dictionary<string, T> myDict, 
     Expression<Func<KeyValuePair<string, T>, bool>> fnLambda) 
    { 
     return myDict.AsQueryable().Where(fnLambda).ToDictionary(t => t.Key, t => t.Value); 
    } 
} 

के बाद से इस समाधान जेनेरिक्स उपयोग कर रहा है, तो आप खोज पैरामीटर के रूप में किसी भी लैम्ब्डा अभिव्यक्ति पारित कर सकते हैं, तो यह बहुत लचीला है।

संबंधित मुद्दे