2009-12-17 13 views
21

मुझे आश्चर्य है कि क्यों List<T>.ForEach(Action<T>) मौजूद है।सी #: सूची <T> के किसी भी लाभ के लिए .एक (...) सादे foreach पाश पर?

elements.ForEach(delegate(Element element){ element.DoSomething(); }); 

foreach(Element element in elements) { element.DoSomething();} 

से अधिक:

वहाँ ऐसा करने में कोई लाभ/अंतर है?

उत्तर

33

एक महत्वपूर्ण अंतर .ForEach विधि आप अंतर्निहित संग्रह संशोधित कर सकते हैं के साथ है। फोरैच सिंटैक्स के साथ यदि आप ऐसा करते हैं तो आपको अपवाद मिलेगा। यहां इसका एक उदाहरण दिया गया है (बिल्कुल सही दिखने वाला नहीं बल्कि यह काम करता है):

static void Main(string[] args) { 
    try { 
     List<string> stuff = new List<string>(); 
     int newStuff = 0; 

     for (int i = 0; i < 10; i++) 
      stuff.Add("."); 

     Console.WriteLine("Doing ForEach()"); 

     stuff.ForEach(delegate(string s) { 
      Console.Write(s); 

      if (++newStuff < 10) 
       stuff.Add("+"); // This will work fine and you will continue to loop though it. 
     }); 

     Console.WriteLine(); 
     Console.WriteLine("Doing foreach() { }"); 

     newStuff = 0; 

     foreach (string s in stuff) { 
      Console.Write(s); 

      if (++newStuff < 10) 
       stuff.Add("*"); // This will cause an exception. 
     } 

     Console.WriteLine(); 
    } 
    catch { 
     Console.WriteLine(); 
     Console.WriteLine("Error!"); 
    } 

    Console.ReadLine(); 
} 
+1

मुझे आज के लिए मेरी "नई चीजें सीखा" मिलीं। धन्यवाद। –

+3

ऐसा इसलिए है क्योंकि कवर के तहत, 'फॉरएच (एक्शन )' लूप के लिए उपयोग करता है। प्रतिबिंब में यह ऐसा लगता है: 'के लिए (int i = 0; i

+3

(दिलचस्प बात यह है कि रिफ्लेक्टर यह भी दिखाता है कि माइक्रोसॉफ्ट में किसी ने "मैच" नामक पैरामीटर वाले 'सूची ' विधियों में से एक से नल चेक को काटकर चिपकाया। यदि आप 'एक्शन ' के रूप में शून्य पास करते हैं, तो यह ' आपको बताएगा कि "मैच" पैरामीटर सही "क्रिया" पैरामीटर की बजाय शून्य है।) –

0

यह सूची में आइटमों पर एक क्रिया निष्पादित करने के लिए एक अधिक सुविधाजनक तरीका/शॉर्टेंड है, MoreLinq IENumerable को लागू करने वाले सभी के लिए यह कार्यक्षमता बढ़ाता है।

13

यह very likely to be faster है (आपको छोटे प्रदर्शन लाभों के कारण केवल एक को चुनना नहीं चाहिए, जब तक आप कम्प्यूटेशनल रूप से भारी संख्या क्रंचिंग या ग्राफिक्स एप्लिकेशन से निपट नहीं रहे हैं और आपको प्रोसेसर चक्रों से अधिक लाभ उठाने की आवश्यकता है) और आप सीधे इसे करने के लिए प्रतिनिधियों को पारित कर सकते हैं कुछ मामलों में सुविधाजनक हो सकता है जो:

list.ForEach(Console.WriteLine); // dumps the list to console. 
+0

बहुत रोचक पढ़ा गया। जब मैं कर सकता हूं, तो मैं +1 कर दूंगा :) –

+3

क्या किसी और ने देखा कि लड़का * 10 मिलियन * पुनरावृत्तियों कर रहा है? और .03 सेकंड की बचत के बारे में बात कर रहे हैं? उस बिंदु पर जहां आप उन पुनरावृत्तियों के भीतर वास्तविक कार्य कर रहे हैं, क्या यह है कि .03 सेकेंड मायने रखता है? –

+4

Kyralessa: बिंदु यह नहीं है कि यह महत्वपूर्ण है या नहीं। उन दोनों के बीच एक तकनीकी अंतर है जो कुछ लोगों के लिए महत्वपूर्ण हो सकता है। इस सवाल का जवाब देने के लिए यह सब कुछ है। –

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