2010-07-19 20 views
9

मैं किसी के लिए निम्न foreach सुविधा समझा कर रहा हूँ, तो यह कहना सही है कि # 2 "LINQ foreach दृष्टिकोण" है या यह सिर्फ एक "List<T> विस्तार विधि" है कि आधिकारिक तौर पर LINQ साथ संबद्ध नहीं है है ?सी # भाषा का कौन सा हिस्सा है .एच()?

var youngCustomers = from c in customers 
        where c.Age < 30 
        select c; 

//1. traditional foreach approach 
foreach (var c in youngCustomers) 
{ 
    Console.WriteLine(c.Display()); 
} 

//2. LINQ foreach approach? 
youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display())); 
+3

एरिक लिपर्ट http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx –

+1

से इस पोस्ट को चेक करें यह ध्यान देने योग्य है कि आपका # 2 लूप होगा आइटम दो बार - एक बार सूची बनाने के लिए, और एक बार ForEach विधि के लिए।यदि आप कोड की उस शैली का उपयोग करना चाहते हैं, जो पूरी तरह से वैध है, तो आप IENumerable पर अपनी खुद की ForEach एक्सटेंशन विधि लिखने से बेहतर हैं। –

उत्तर

24

it is a normal method of List<T> हालांकि लोगों को अक्सर अन्य IEnumerable<T> के लिए अपने स्वयं के विस्तार के तरीकों प्रदान करते हैं। LINQ does not provide a ForEach extension कार्यात्मक/अपरिवर्तनीय प्रकारों के साथ काम करने के अपने डिजाइन लक्ष्यों के कारण, फॉरएच एक अंतर्निहित साइड इफेक्ट/अनिवार्य ऑपरेशन है।

+0

यह मुझे संदेह है, लेकिन अगर आप "linq foreach" के लिए Google खोज करते हैं तो यह अनिश्चित था कि यह व्यापक रूप से गलत धारणा है कि .Each() LINQ –

10

इसका LINQ से कोई लेना देना नहीं है और यह एक विस्तार विधि नहीं है।

ForEachList<T> कक्षा पर एक सादा उदाहरण विधि है।

(और अगर आप वास्तव में nitpicky बनना चाहता था, तो ForEach नहीं सी # भाषा का हिस्सा ही है: यह .NET बेस कक्षा लाइब्रेरी का हिस्सा है।)

+0

बेस क्लास लाइब्रेरी (बीसीएल) उर्फ ​​फ्रेमवर्क क्लास लाइब्रेरी (एफसीएल) – abatishchev

+0

@abatishchev: मेरी समझ यह है कि बीसीएल और एफसीएल समानार्थी नहीं हैं। एफसीएल बीसीएल का एक सुपरसेट है। Http://en.wikipedia.org/wiki/Base_Class_Library और http://en.wikipedia.org/wiki/Framework_Class_Library देखें। – LukeH

+0

हाँ, मैंने उन्हें दोनों देखा। मुझे लगता है कि ये दो लेख कुछ हद तक अस्पष्ट हैं। मुझे नहीं पता कि माइक्रोसॉफ्ट ने अभी तक उन्हें क्यों संपादित नहीं किया है। जैसा कि यह लेखों से मिलता है, बीसीएल में केवल ईसीएमए मानकीकृत नामस्थान होते हैं, इस बीच एफसीएल - सभी मानक नामस्थान। सही? – abatishchev

2

यह List<T> का एक विस्तार विधि नहीं है, यह List<T> की एक नियमित विधि है।

तो इसका LINQ से कोई लेना देना नहीं है। यदि यह था, "आधिकारिक तौर पर LINQ से जुड़े" के बीच भेद और आधिकारिक तौर पर LINQ से संबद्ध नहीं है, व्यावहारिक रूप से बहुत उपयोगी नहीं है। LINQ बस जंजीर विस्तार विधियों का एक गुच्छा है (अक्सर IEnumerable<T> पर)। IEnumerable<T> पर अन्य एक्सटेंशन विधियों से इसे अलग करने में शायद ही कोई बिंदु है। सबसे अच्छा भेद यह होगा कि वे System.Linq या System.Something.Linq नामस्थानों में से एक में रहते हैं।

1
youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display())); 

के इसे तोड़ने के नीचे दो::

एरिक Lippert सब इस बारे में एक ब्लॉग लेख है

  • ToList .नेट फ्रेमवर्क में पेश System.Linq.Enumerable.ToList() के लिए एक कॉल है 3.5
  • ForEachSystem.Collections.Generic.List<T>.ForEach पर कॉल किया गया है .नेट फ्रेमवर्क 2.0
  • c => सी # 3.0 में लैम्ब्डा अभिव्यक्ति वाक्यविन्यास पेश किया गया है।

यदि आप List<T>.ForEach के लिए प्रलेखन को देखते हैं, तो आप पुराने प्रतिनिधि वाक्यविन्यास को देख सकते हैं जिसे इसे कॉल करने के लिए आवश्यक था।

0

साइड-इफेक्टिंग फोरच विजुअल स्टूडियो 2010 के लिंक एक्सटेंशन में प्रदान किया जाएगा (है)।