2010-04-23 18 views
13

हम संग्रह के माध्यम से लूप के लिए उपयोग या foreach का उपयोग करते हैं और प्रत्येक प्रविष्टि को संसाधित करते हैं।फोरच/लूप वैकल्पिक लैम्ब्डा फ़ंक्शन के लिए?

क्या सी # में संग्रह के लिए उन सभी नए लैम्ब्डा कार्यों में कोई विकल्प है?

foreach(var v in vs) 
{ 
    Console.write(v); 
} 

करने का पारंपरिक तरीका ऐसा कुछ है?

vs.foreach(v => console.write(v)) 
+0

के संभावित डुप्लिकेट [के लिए foreach के LINQ बराबर IEnumerable ] (http://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for-ienumerablet) – nawfal

उत्तर

15

सूची में फॉरएच विधि है, हालांकि, IENumerable नहीं है।

इसके बारे में कई प्रश्न/उत्तर हैं। मुझे लगता है कि मुख्य कारण यह आईन्यूमेरेबल में लागू नहीं किया गया था, हालांकि यह है कि एनक्यूमेबल्स पर लिंक "अर्थात्" एक साइड इफेक्ट मुक्त है क्योंकि यह एक पूछताछ भाषा है।

एरिक लिपर्ट अपने ब्लॉग पर अपने विचार बताते हैं।

http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

+0

+1, जहां वह बताता है कि ऐसा क्यों करना एक बुरा विचार है (और परंपरागत 'foreach' वास्तव में बेहतर है)। –

1

आप क्या लिखा है पूरी तरह से कानूनी (मामले से अलग) है - यह सोचते हैं कि vs के प्रकार ForEach एक विस्तार पद्धति के रूप में परिभाषित किया गया है या अगर यह एक List है।

ForEachList<T> के लिए परिभाषित किया गया है:

List<T> के प्रत्येक तत्व पर निर्दिष्ट किया गया कार्य करता है।

8

हां।

List<string> list = new List<string>() { "1", "2", "3", "4" }; 

list.ForEach(s => Console.WriteLine(s)); 

कि क्या आप देख रहे हैं है:

सूची के लिए एक foreach विधि है:

IList की के , वहाँ एक foreach विस्तार विधि है?

+0

बस स्पष्ट होना: यह एक तरीका है 'सूची ' के भीतर, यह एक विस्तार विधि * नहीं * है। LINQ को फॉरएच जोड़ने का कोई अर्थ नहीं है, लेकिन यह * इसे 'IList ' पर ले जाने के लिए समझ में आता है: यहां जाएं [https://connect.microsoft.com/VisualStudio/feedback/details/552410/move-lot-of-help-methods-from-list-to-ilist-use-extension-विधियों) इसका समर्थन करने के लिए! :) –

+0

हम्म, मैं सही खड़ा हूँ। मैंने हमेशा सोचा कि यह कंक्रीट कार्यान्वयन की विधि के बजाय IList का विस्तार था। –

+0

** ** के ** ** के बारे में हेहेह, मैंने आपका जवाब संपादित किया, लेकिन खेद है कि मैं आपकी टिप्पणी संपादित नहीं कर सकता, स्वयं की मदद कर सकता हूं :-) –

0
static void Main(string[] args) 
{ 
    int[] i = {1, 2, 3, 4, 5, 6, 7, 78, 8, 9}; 
    var data = i.ToList(); 

    data.ForEach(m => { Console.WriteLine(m); }); 

    Console.ReadKey(); 
} 
2

डिफ़ॉल्ट रूप से, वहाँ एक नहीं है।
आप अपनी खुद की निर्धारित कर सकते हैं:

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

.NET 3.5 के Linq Foreach नहीं है, हालांकि LinqBridge एक प्रदान की है। मैं लिंकब्रिज का उपयोग करने के आदी हो गया कि मैं स्वाभाविक रूप से assumed यह .NET 3 का हिस्सा है।5 फ्रेमवर्क

बस अपने विस्तार तरीकों संग्रह में जोड़ने अगर आपको लगता है कि यह आपके कार्यक्रम के लिए स्पष्टता ला सकता है

static class Helper 
{ 
    public static IEnumerable<t> ForEeach<t> 
     (this IEnumerable<t> source, Action<t> act) 
    { 
     foreach (T element in source) act(element); 
     return source; 
    } 
} 
2

एरिक तथ्य सूची < टी> के लिए एक foreach है कि वहाँ के अलावा एक सम्मोहक तर्क बनाता है लेकिन केवल सूची < टी> के लिए। मैंने उस बहुत उपयोगी विस्तार विधि का उपयोग करने के लिए कई अवसरों को झुका दिया है और आईनेमेरेबल < टी> के लिए सामान्य एक्सटेंशन विधि की कमी से समान रूप से निराश हो गया है, इसलिए मैंने अंत में अपना खुद का लिखने का फैसला किया।

करने में ऐसा है, तो मैं एक कदम आगे जा रहा है और एक बार जब < टी> और ForEvery < टी> धाराप्रवाह विस्तार तरीकों कि प्रत्येक आइटम और उस श्रृंखला में एक कार्रवाई के निष्पादन सिर्फ एक बार पर कार्रवाई की अनुमति देने के चियांग लेखन समाप्त हो गया, अगर उस समय एक अच्छा विचार की तरह किसी अन्य कारण के लिए।

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

    public static IEnumerable<T> Once<T>(this IEnumerable<T> collection, 
     Func<IEnumerable<T>, bool> predicate, Action<IEnumerable<T>> action) 
    { 
     if (predicate(collection)) 
     action(collection); 
     return collection; 
    } 

    public static IEnumerable<T> ForEvery<T>(this IEnumerable<T> collection, 
     Func<T, bool> predicate, Action<T> action) 
    { 
     foreach (var item in collection) 
     { 
     if (predicate(item)) 
      action(item); 
     } 
     return collection; 
    } 
} 

तुम मेरे ब्लॉग पोस्ट Extend IEnumerable with ForEach and Once Methods पर उपयोग का उदाहरण कोड पा सकते हैं:

कोड यह रहा।

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