क्या मेरे पास IENumerator <T> लौटने का तरीका हो सकता है और इसे फ़ोरैच लूप में उपयोग कर सकता है?

मुझे अपने फॉर्म पर प्रत्येक टेक्स्टबॉक्स की ऊंचाई सेट करने की आवश्यकता है, जिनमें से कुछ अन्य नियंत्रणों में घोंसला है। मैंने सोचा कि मैं ऐसा कुछ कर सकता हूं:

private static IEnumerator FindTextBoxes(Control rootControl)
{
    foreach (Control control in rootControl.Controls)
    {
        if (control.Controls.Count > 0)
        {
            // Recursively search for any TextBoxes within each child control
            foreach (TextBox textBox in FindTextBoxes(control))
            {
                yield return textBox;
            }
        }

        TextBox textBox2 = control as TextBox;
        if (textBox2 != null)
        {
            yield return textBox2;
        }
    }
}

इस तरह इसका उपयोग करना:

foreach(TextBox textBox in FindTextBoxes(this))
{
    textBox.Height = height;
}

लेकिन निश्चित रूप से संकलक अपनी डमी थूकता है, क्योंकि foreach IEnumerator की बजाय IEnumerable की अपेक्षा करता है।

क्या GetEnumerator() विधि के साथ एक अलग वर्ग बनाने के बिना ऐसा करने का कोई तरीका है?

0
जोड़ा संपादित
विचारों: 1
असल में, foreach किसी IEnumerable की अपेक्षा नहीं करता है (न ही IENumerable )। यह केवल उस चीज़ की अपेक्षा करता है जिसमें GetEnumerator विधि हो। बदले में, उस विधि को IENumerator या IENumerator वापस करने की आवश्यकता नहीं है? इसे केवल उस चीज़ को वापस करने की आवश्यकता है जिसमें MoveNext() विधि और Current प्रॉपर्टी हो।
जोड़ा लेखक Timwi, स्रोत

5 उत्तर

केवल स्पष्ट करने हेतु

private static IEnumerator FindTextBoxes(Control rootControl)

में परिवर्तन

private static IEnumerable FindTextBoxes(Control rootControl)

यह सब होना चाहिए :-)

0
जोड़ा
// Generic function that gets all child controls of a certain type, 
// returned in a List collection
private static List GetChildTextBoxes(Control ctrl) where T : Control{
    List tbs = new List();
    foreach (Control c in ctrl.Controls) {
        // If c is of type T, add it to the collection
        if (c is T) { 
            tbs.Add((T)c);
        }
    }
    return tbs;
}

private static void SetChildTextBoxesHeight(Control ctrl, int height) {
    foreach (TextBox t in GetChildTextBoxes(ctrl)) {
        t.Height = height;
    }
}
0
जोड़ा

यदि आपको एक गणक दिया गया है, और इसे प्रत्येक लूप के लिए उपयोग करने की आवश्यकता है, तो आप इसे लपेटने के लिए निम्न का उपयोग कर सकते हैं:

static public class enumerationHelper
{
    public class enumeratorHolder
    {
        private T theEnumerator;
        public T GetEnumerator() { return theEnumerator; }
        public enumeratorHolder(T newEnumerator) { theEnumerator = newEnumerator;}
    }
    static enumeratorHolder toEnumerable(T theEnumerator) { return new enumeratorHolder(theEnumerator); }
    private class IEnumeratorHolder:IEnumerable
    {
        private IEnumerator theEnumerator;
        public IEnumerator GetEnumerator() { return theEnumerator; }
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return theEnumerator; }
        public IEnumeratorHolder(IEnumerator newEnumerator) { theEnumerator = newEnumerator; }
    }
    static IEnumerable toEnumerable(IEnumerator theEnumerator) { return new IEnumeratorHolder(theEnumerator); }
}

The toEnumerable method will accept anything that or would regard an acceptable return type from GetEnumerator, and return something that can be used in foreach. If the parameter is an IEnumerator<> the response will be an IEnumerable, though calling GetEnumerator on it once will likely yield bad results.

0
जोड़ा

यदि आप IENumerator को वापस करते हैं, तो यह प्रत्येक बार उस विधि को कॉल करने के लिए एक अलग एन्यूमेरेटर ऑब्जेक्ट होगा (जैसा कि आप प्रत्येक पुनरावृत्ति पर गणक को रीसेट करते हैं)। यदि आप IENumerable लौटाते हैं तो एक foreach उपज कथन के साथ विधि के आधार पर गणना कर सकते हैं।

0
जोड़ा

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

0
जोड़ा
उपज वापसी उन विधियों के साथ उपयोग की जा सकती है जो या तो IENumerable या IENumerator । यह केवल foreach लूप में है जहां IEnumerator का उपयोग नहीं किया जा सकता है।
जोड़ा लेखक Timwi, स्रोत