2009-10-02 9 views
128

संभव डुप्लिकेट "प्रत्येक के लिए":
Linq equivalent of foreach for IEnumerableLinq शैली

वहाँ आपरेशन "प्रत्येक के लिए" के लिए किसी भी Linq शैली वाक्य रचना है?

उदाहरण के लिए, एक से दूसरे संग्रह, पहले से ही एक मौजूदा के आधार पर मान जोड़ें:

IEnumerable<int> someValues = new List<int>() { 1, 2, 3 }; 

IList<int> list = new List<int>(); 

someValues.ForEach(x => list.Add(x + 1)); 

के बजाय

foreach(int value in someValues) 
{ 
    list.Add(value + 1); 
} 
+0

इस सवाल का संबंधित है, लेकिन नहीं काफी शिकार: http://stackoverflow.com/questions/858978/lambda-expression-using-foreach-clause – LukeH

+3

भी एरिक Lippert को इस ब्लॉग पोस्ट देखें, के बारे में बीसीएल में 'फॉरएच' सहित नहीं के लिए तर्क: http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx – LukeH

+0

http://stackoverflow.com/questions/200574/linq-equal-of-foreach-for-ienumerable – aku

उत्तर

187

ToList का उपयोग करना() विस्तार विधि अपने सबसे अच्छा विकल्प है:

someValues.ToList().ForEach(x => list.Add(x + 1)); 

बीसीएल में कोई विस्तार विधि नहीं है जो सीधे FOREach लागू करती है।


वहाँ बीसीएल कि यह करता है में कोई विस्तार विधि है हालांकि, वहाँ अभी भी System नाम स्थान में एक विकल्प है ... अगर आप अपनी परियोजना के लिए Reactive Extensions जोड़ें:

using System.Reactive.Linq; 

someValues.ToObservable().Subscribe(x => list.Add(x + 1)); 

ToList के उपर्युक्त उपयोग के रूप में इसका एक ही अंतिम परिणाम है, लेकिन सिद्धांत (सिद्धांत में) अधिक कुशल है, क्योंकि यह सीधे प्रतिनिधि को मूल्यों को स्ट्रीम करता है।

+4

ध्यान रखें कि यह एक बहुत लंबी सूची के लिए आदर्श नहीं है, क्योंकि यह पूरी सूची की प्रतिलिपि बनाता है इससे पहले कि यह लूपिंग हो। –

+6

'ToList' को कॉल करने के बाद' फॉरएच 'में मूल संग्रह के माध्यम से दो बार पुनरावृत्ति शामिल है। मैं किसी भी दिन मानक 'foreach' लूप पसंद करूंगा: कम टाइपिंग, अधिक पठनीय और बेहतर प्रदर्शन:' foreach (varValues ​​में var x) सूची। जोड़ें (x + 1); ' – LukeH

+20

किसी को भी जो इसे देखता है और सोचता है अच्छा जवाब, इसकी नहीं। यह पागल अक्षम है। चीजों को करने के सही तरीके के लिए नोल्डोरिन का जवाब देखें। – Steve

2

मानक लिंक में ऐसा कुछ भी नहीं है, लेकिन MoreLinq में फ़ॉरएच ऑपरेटर है।

67

Array और List<T> कक्षाओं में पहले से ही ForEach विधियां हैं, हालांकि केवल यह विशिष्ट कार्यान्वयन है। (ध्यान दें कि पूर्व में static है)।

यह सुनिश्चित नहीं है कि यह वास्तव में foreach कथन पर एक बड़ा लाभ प्रदान करता है, लेकिन आप सभी IEnumerable<T> ऑब्जेक्ट्स के लिए नौकरी करने के लिए एक विस्तार विधि लिख सकते हैं।

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) 
{ 
    foreach (var item in source) 
     action(item); 
} 

यह आपके प्रश्न में पोस्ट किए गए सटीक कोड को वैसे ही काम करने की अनुमति देगा जैसा आप चाहते हैं।

+0

धन्यवाद, यह स्पष्ट है कि मैं खुद को एक्सटेंशन लिख सकता हूं। मैं बस ऐसा करने से पहले जितनी दूर हो सके सामान में निर्मित करना चाहता हूं। –

+0

हाँ, यह काफी उचित है। मैं यह भी सुनिश्चित करता हूं कि मैं भी बीसीएल कार्यक्षमता को पुन: पेश नहीं कर रहा हूं। इस मामले में, हालांकि कोई नहीं है। – Noldorin

+0

ऐरे क्लास में फॉरएच विधि नहीं है :) लेकिन माइक्रोसॉफ्ट में एक "एन्यूमेबल एक्स्टेंशन" स्टेटस्क क्लास है। प्रैक्टिस.ऑब्जेक्टबिल्डर 2 नेमस्पेस। यह IENumerable के लिए foreach विधि है :) – ArgeKumandan

22

वहाँ में निर्मित कुछ भी नहीं है, लेकिन आप आसानी से यह करने के लिए अपने खुद के विस्तार विधि बना सकते हैं:

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) 
{ 
    if (source == null) throw new ArgumentNullException("source"); 
    if (action == null) throw new ArgumentNullException("action"); 

    foreach (T item in source) 
    { 
     action(item); 
    } 
} 
12

अधिकारी एमएस लाइन है "क्योंकि यह एक कार्यात्मक आपरेशन नहीं है" (यानी यह एक है राज्यव्यापी ऑपरेशन)।

आप की तरह कुछ भी नहीं किया जा सका:

list.Select(x => x+1) 

या तुम सच में एक सूची में इसकी जरूरत है, तो:

var someValues = new List<int>(list.Select(x => x+1)); 
+2

आपके पास कार्यात्मक बनाम राज्यव्यापी संचालन के बारे में एक बिंदु है। हालांकि, एफ # को कार्यात्मक लंबाई के रूप में डिजाइन किया गया था, और इसके बराबर 'फॉरएच' विधि है। – Noldorin

1

कोई Linq foreach एक्सटेंशन नहीं है।हालांकि, List कक्षा में इसके लिए एक फ़ॉरएच विधि है, यदि आप सीधे List का उपयोग करने के इच्छुक हैं।

क्या इसके लायक है के लिए, मानक foreach वाक्य रचना आप इच्छित परिणाम दे देंगे और यह शायद पढ़ने में आसान है:

foreach (var x in someValues) 
{ 
    list.Add(x + 1); 
} 

आप अड़े हैं, तो आप एक Linq शैली विस्तार चाहते हैं। इसे स्वयं लागू करने के लिए यह छोटा है।

public static void ForEach<T>(this IEnumerable<T> @this, Action<T> action) 
{ 
    foreach (var x in @this) 
     action(x); 
}