2008-12-08 4 views
14

में कस्टम ऑब्जेक्ट्स पर फ़ोरैच कीवर्ड का उपयोग कैसे करें 0 कोई व्यक्ति कस्टम ऑब्जेक्ट्स के साथ foreach कीवर्ड का उपयोग करने का एक सरल उदाहरण साझा कर सकता है?सी #

+0

विशेष रूप से क्या सवाल है? एक कस्टम ऑब्जेक्ट के साथ * foreach * का उपयोग कैसे करें? या कस्टम ऑब्जेक्ट में कोड कैसे लिखना है ताकि उस पर foreach का उपयोग किया जा सके? –

+1

कस्टम ऑब्जेक्ट में कोड कैसे लिखना है ताकि फोरैच का उपयोग – user42070

उत्तर

37

टैग को देखते हुए, मुझे लगता है कि आप .NET में मतलब रखते हैं - और मैं सी # के बारे में बात करना चुनूंगा, जैसा कि मुझे पता है।

foreach कथन (आमतौर पर) IEnumerable और IEnumerator या उनके सामान्य चचेरे भाई का उपयोग करता है। प्रपत्र का विवरण:

using (IEnumerator<Foo> iterator = source.GetEnumerator()) 
{ 
    Foo element; 
    while (iterator.MoveNext()) 
    { 
     element = iterator.Current; 
     // Body 
    } 
} 

ध्यान दें कि IEnumerator<Foo>, अंत में निपटान किया जाता है लेकिन बयान बाहर निकलता है:

foreach (Foo element in source) 
{ 
    // Body 
} 

जहां source लागू करता IEnumerable<Foo>को मोटे तौर पर बराबर है। यह इटरेटर ब्लॉक के लिए महत्वपूर्ण है।

IEnumerable<T> या IEnumerator<T> स्वयं को लागू करने के लिए, इटरेटर ब्लॉक का उपयोग करने का सबसे आसान तरीका है। यहां सभी विवरण लिखने के बजाय, शायद आपको chapter 6 of C# in Depth पर संदर्भित करना सबसे अच्छा है, जो एक मुफ्त डाउनलोड है। पूरा अध्याय 6 इटेटर पर है। मैं भी पर गहराई साइट में मेरी सी # लेख का एक और जोड़ी:

एक त्वरित उदाहरण हालांकि के रूप में:

public IEnumerable<int> EvenNumbers0To10() 
{ 
    for (int i=0; i <= 10; i += 2) 
    { 
     yield return i; 
    } 
} 

// Later 
foreach (int x in EvenNumbers0To10()) 
{ 
    Console.WriteLine(x); // 0, 2, 4, 6, 8, 10 
} 

एक के लिए IEnumerable<T> लागू करने के लिए टाइप करें, आप कुछ ऐसा कर सकते हैं:

public class Foo implements IEnumerable<string> 
{ 
    public IEnumerator<string> GetEnumerator() 
    { 
     yield return "x"; 
     yield return "y"; 
    } 

    // Explicit interface implementation for nongeneric interface 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); // Just return the generic version 
    } 
} 
+0

पर किया जा सके। पीडीएफ सीधा लिंक मैनिंग पेज पर फिर से निर्देशित करता है - शायद यह बेहतर काम करेगा: http://www.manning.com/skeet/ –

+0

धन्यवाद बहुत अधिक - अब फिक्सिंग। यह थोड़ा परेशान है :( –

6

(मुझे लगता है सी यहाँ #)

आप कस्टम की एक सूची वस्तुओं आप सिर्फ एक ही तरह से foreach उपयोग कर सकते हैं के रूप में आप किसी अन्य वस्तु के साथ क्या किया है:

List<MyObject> myObjects = // something 
foreach(MyObject myObject in myObjects) 
{ 
    // Do something nifty here 
} 

अगर आप चाहते हैं अपने स्वयं के कंटेनर बनाने के लिए आप इग्यूमेरेबल इंटरफ़ेस के साथ उपज कीवर्ड (.NET 2.0 और ऊपर से मुझे विश्वास करते हैं) का उपयोग कर सकते हैं।

class MyContainer : IEnumerable<int> 
{ 
    private int max = 0; 
    public MyContainer(int max) 
    { 
     this.max = max; 
    } 

    public IEnumerator<int> GetEnumerator() 
    { 
     for(int i = 0; i < max; ++i) 
      yield return i; 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

और फिर foreach के साथ उपयोग करें:

MyContainer myContainer = new MyContainer(10); 
foreach(int i in myContainer) 
    Console.WriteLine(i);