2013-02-06 15 views
28

मैं .NET के लिए बहुत नया हूं, PHP में काम करने के लिए उपयोग किया जाता है। मुझे वस्तुओं के शब्दकोश के माध्यम से foreach के माध्यम से पुनरावृत्त करने की आवश्यकता है। मेरा सेटअप एक एमवीसी 4 ऐप है।शब्दकोश वस्तु के माध्यम से लूपिंग

मॉडल इस तरह दिखता है:

public class TestModels 
{ 
    Dictionary<int, dynamic> sp = new Dictionary<int, dynamic> 
    { 
     {1, new {name="abc", age="1"}}, 
     {2, new {name="def", age="2"}} 
    } 
} 

नियंत्रक:

public class TestController : Controller 
{ 
    Models.TestModels obj = new Models.TestModels(); 
} 

मैं कैसे obj वस्तु के माध्यम से पाश और शब्दकोश के मूल्यों को पुनः प्राप्त करने और उन्हें ध्यान में रखते हुए प्रिंट करूं?

+2

के संभावित डुप्लिकेट [क्या सबसे अच्छा तरीका है सी # में एक शब्दकोश से अधिक पुनरावृति करने के लिए है?] (Http://stackoverflow.com/questions/141088/what-is-the-best-way-to-iterate ओवर-ए-शब्दकोश में ग) – Jeremy

+2

(मैं डुप्लीकेट के रूप में रूप में अच्छी तरह मतदान: बस यह ध्यान रखें कि यात्रा के क्रम में परिभाषित नहीं है ..) –

उत्तर

49

एक तरीका यह शब्दकोश की कुंजी है, जो मेरा सुझाव लूप करने के लिए है:

foreach(KeyValuePair<int, dynamic> pair in sp) 
{ 
    int key = pair.Key; 
    dynamic value = pair.Value; 
} 

मैं:

foreach(int key in sp.Keys) 
    dynamic value = sp[key]; 

एक और तरीका है, जोड़े में से एक दृश्य के रूप में शब्दकोश लूप करने के लिए है , पहले दृष्टिकोण सुझाव है कि आप पुनः प्राप्त वस्तुओं के आदेश पर अधिक नियंत्रण हो सकता है क्योंकि अगर आप उचित LINQ बयान, जैसे के साथ Keys संपत्ति को सजाने, sp.Keys.OrderBy(x => x) आप कुंजी के आरोही क्रम में आइटम पुनर्प्राप्त मदद करता है। ध्यान दें कि Dictionary आंतरिक रूप से hash table डेटा संरचना का उपयोग करता है, इसलिए यदि आप दूसरी विधि का उपयोग करते हैं तो आइटमों का क्रम आसानी से अनुमानित नहीं है।

अद्यतन (01 दिसंबर 2016): वास्तविक प्रकार के साथ प्रतिस्थापित var रों जवाब और अधिक स्पष्ट बनाने के लिए।

+0

तो दृश्य में किया जा रहा है? मूल्य में दोनों मान सही होंगे? ऐसा है तो मैं सिर्फ मुद्रित करने के लिए value.0 और value.1 क्या करना है? – user1833222

+0

नहीं। आप इसे मेरे उत्तर में करेंगे, या सिना के उत्तर के आधार पर आप इसे 'वैल्यू' और नाम जो आपने चर दिया है, का उपयोग करके कॉल करेंगे। 'value.name' या' value.age'। – eandersson

+2

छोटा बिंदु: यह समझने में थोड़ा आसान होगा कि var कीवर्ड का उपयोग नहीं किया गया था – Jezzamon

3

यह क्या आप शब्दकोश में के बाद कर रहे हैं

Models.TestModels obj = new Models.TestModels(); 

foreach (var keyValuPair in obj.sp) 
{ 
    // KeyValuePair<int, dynamic> 
} 

foreach (var key in obj.sp.Keys) 
{ 
    // Int 
} 

foreach (var value in obj.sp.Values) 
{ 
    // dynamic 
} 
1

पर निर्भर करता है आप इसे इस तरह कर सकते हैं।

Models.TestModels obj = new Models.TestModels(); 
foreach (var item in obj.sp) 
{ 
    Console.Write(item.Key); 
    Console.Write(item.Value.name); 
    Console.Write(item.Value.age); 
} 

समस्या आप सबसे अधिक संभावना अभी उस संग्रह private है। आप इस पंक्ति के आरम्भ में public जोड़ देते हैं तो

Dictionary<int, dynamic> sp = new Dictionary<int, dynamic> 

आप अपने नियंत्रक के अंदर समारोह से उस तक पहुंच सक्षम होना चाहिए।

संपादित करें: पूर्ण TestModels कार्यान्वयन का कार्यात्मक उदाहरण जोड़ना।

आपका TestModels वर्ग कुछ इस तरह दिखना चाहिए।

public class TestModels 
{ 
    public Dictionary<int, dynamic> sp = new Dictionary<int, dynamic>(); 

    public TestModels() 
    { 
     sp.Add(0, new {name="Test One", age=5}); 
     sp.Add(1, new {name="Test Two", age=7}); 
    } 
} 

आप शायद के रूप में अच्छी dynamic कीवर्ड पर पढ़ना चाहते हैं।

0
public class TestModels 
{ 
    public Dictionary<int, dynamic> sp = new Dictionary<int, dynamic>(); 

    public TestModels() 
    { 
     sp.Add(0, new {name="Test One", age=5}); 
     sp.Add(1, new {name="Test Two", age=7}); 
    } 
} 
+2

आपका उत्तर निश्चित रूप से थोड़ा स्पष्टीकरण के लायक है। कृपया http://stackoverflow.com/help/how-to-answer देखें। –

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