2011-08-02 17 views
9

पर आईन्यूमेरेटर को कैसे कार्यान्वित करें इस कक्षा पर आईन्यूमेरेटर को कैसे कार्यान्वित करें ताकि मैं इसे फ़ोरैच लूप में उपयोग कर सकूं।सी # - कक्षा

public class Items 
    { 
     private Dictionary<string, Configuration> _items = new Dictionary<string, Configuration>(); 

     public Configuration this[string element] 
     { 
      get 
      { 

       if (_items.ContainsKey(element)) 
       { 
        return _items[element]; 
       } 
       else 
       { 
        return null; 
       } 
      } 

      set 
      { 
       _items[element] = value; 
      } 
     } 
    } 

इस उदाहरण में कॉन्फ़िगरेशन कुछ गुणों के साथ एक साधारण वर्ग है।

+0

संभावित डुप्लिकेट [आप IENumerator इंटरफ़ेस को कैसे कार्यान्वित करेंगे?] (Http://stackoverflow.com/questions/53967/how-would-you-implement-the-ienumerator-interface) –

उत्तर

11

टाइपएफ़ IEnumerable को लागू करने के लिए बस एक उदाहरण और IEnumerator जो आप फ़ोरैच लूप में उपयोग करने में सक्षम होंगे।

public class Items : IEnumerable<Configuration> 
    { 
     private Dictionary<string, Configuration> _items = new Dictionary<string, Configuration>(); 


     public void Add(string element, Configuration config) { 
      _items[element] = config; 
     } 

     public Configuration this[string element] 
     { 
      get 
      { 

       if (_items.ContainsKey(element)) 
       { 
        return _items[element]; 
       } 
       else 
       { 
        return null; 
       } 
      } 

      set 
      { 
       _items[element] = value; 
      } 
     } 

     public IEnumerator<Configuration> GetEnumerator() 
     { 
      return _items.Values.GetEnumerator(); 
     } 

     System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
     { 
      return _items.Values.GetEnumerator(); 
     } 
    } 

सम्मान।

+0

धन्यवाद @ टिग्रान, यह काम करता है मेरे लिए – Riz

+0

आप बस डिक्शनरी कक्षा के कार्यान्वयन का उपयोग करते हैं, इसलिए आप तकनीकी रूप से IENumerator को लागू नहीं कर रहे हैं :-)। – Sebastian

+0

@ मैं इसे नीचे वर्गीकृत वर्ग का उपयोग करके कार्यान्वित कर रहा हूं। – Tigran

1

आपको IEnumerable या किसी भी इंटरफ़ेस को लागू करने की आवश्यकता नहीं है।

IEnumerator GetEnumerator() 
+1

मुझे यह नहीं पता था! अनावश्यक प्रयास बचाता है, 'IENumerable ' 'IEnumrable' से विरासत 'जो एक परेशान गड़बड़ पैदा करता है। –

2

आप इस तरह IEnumerator लागू करने के लिए सक्षम होना चाहिए:: एक foreach में अपने वर्ग का उपयोग करने में सक्षम हो, में सब है कि आप की जरूरत है follwing हस्ताक्षर के साथ अपने वर्ग के लिए एक उदाहरण विधि जोड़ना है

public class Items : IEnumerator<KeyValuePair<string, Configuration>> 
{   
    private Dictionary<string, Configuration> _items = new Dictionary<string, Configuration>();   
    public Configuration this[string element]  
    {    
     get 
     { 
      if (_items.ContainsKey(element)) 
      { 
       return _items[element]; 
      } 
      else 
      { 
       return null; 
      } 
     } 
     set 
     { 
      _items[element] = value; 
     } 
    } 

    int current; 
    public object Current 
    { 
     get { return _items.ElementAt(current); } 
    } 

    public bool MoveNext() 
    { 
     if (_items.Count == 0 || _items.Count <= current) 
     { 
      return false; 
     } 
     return true; 
    } 

    public void Reset() 
    { 
     current = 0; 
    } 

    public IEnumerator GetEnumerator() 
    { 
     return _items.GetEnumerator(); 
    } 

    KeyValuePair<string, Configuration> IEnumerator<KeyValuePair<string, Configuration>>.Current 
    { 
     get { return _items.ElementAt(current); } 
    } 

    public void Dispose() 
    { 
     //Dispose here 
    } 
} 

लेकिन जैसा कि पहले से ही नोट किया गया है कि आप IEnumerable को भी लागू कर सकते हैं।

+0

टिग्रेन की तरह आप बस डिक्शनरी क्लास के एन्युमरेटर का उपयोग कर रहे हैं। – Sebastian

+0

अपनी पोस्ट के साथ खुद को लागू करने का प्रयास किया, लेकिन ध्यान दिया कि आपका वर्तमान कभी बढ़ता नहीं है। मुझे लगता है कि आप MoveNext() में करना चाहते थे? – radonthetyrant

+0

परिवर्तनीय 'वर्तमान' को -1 के साथ शुरू किया जाना चाहिए (दोनों कन्स्ट्रक्टर में और रीसेट विधि में)। –

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