2008-12-04 22 views
31

पर एक लैम्ब्डा अभिव्यक्ति - ForEach() का उदाहरण सबसे पहले, मुझे पता है कि पहले से ही ढांचे में जेनेरिक List<> वर्ग के तरीके List<> पर पुनरावृत्त करते हैं।सी # सिंटेक्स - जेनेरिक सूची

लेकिन उदाहरण के तौर पर, List<> के प्रत्येक ऑब्जेक्ट पर पुनरावृत्ति करने के लिए फॉरएच विधि लिखने के लिए सही वाक्यविन्यास क्या है, और प्रत्येक ऑब्जेक्ट पर Console.WriteLine(object.ToString()) करें। कुछ ऐसा जो List<> को पहला तर्क और लैम्बडा अभिव्यक्ति के रूप में दूसरे तर्क के रूप में लेता है।

मैंने देखा है कि अधिकांश उदाहरण एक्सटेंशन विधियों के रूप में किए गए हैं या LINQ शामिल हैं। मैं एक सादे पुराने विधि उदाहरण की तलाश में हूं।

उत्तर

50
public void Each<T>(IEnumerable<T> items, Action<T> action) 
{ 
    foreach (var item in items) 
     action(item); 
} 

... और यह thusly फोन:

new List<SomeType>(items).ForEach(
    i => Console.WriteLine(i) 
); 

यह एक सामान्य सूची बनाता है और साथ यह भरता है:

Each(myList, i => Console.WriteLine(i)); 
+0

कूल हो जाता है। अब फनक <> वाक्यविन्यास जहां मैंने देखा है, खेल में आता है? – BuddyJoe

+11

Func <> प्रतिनिधि वापसी मूल्यों के तरीकों के लिए सामान्य प्रतिनिधि हैं। एक्शन <> प्रतिनिधि वापसी मूल्यों के बिना विधियों के लिए सामान्य प्रतिनिधि हैं। केवल अंतर है। – TheSoftwareJedi

+1

तो आपके मामले में, आपको कुछ वापस करने की आवश्यकता नहीं है (console.writeline से - तो एक्शन पर्याप्त है। – TheSoftwareJedi

26

ऊपर के रूप में भी कम कोड के साथ लिखा जा सकता है IENumerable और फिर सूची ऑब्जेक्ट्स को प्रत्येक के लिए कॉल करता है।

+0

प्रश्न पूछा गया कि विधि को कैसे लिखना है (इसे कैसे कॉल करें), और निर्दिष्ट किया कि वह LINQ या एक्सटेंशन विधियों का उपयोग नहीं करना चाहता था। – StriplingWarrior

+0

यह सुविधाजनक है, लेकिन एक नई सूची बनाने का ओवरहेड नहीं है (कम से कम एक अतिरिक्त समय पर आइटम को फिर से लागू करना) आमतौर पर इसके लायक नहीं है? – dumdum

+0

बहुत उपयोगी, धन्यवाद। – Bryan

0

आप सूची में प्रत्येक स्ट्रिंग को पार कर सकते हैं और यहां तक ​​कि आप पूरे जेनेरिक में एक ही कथन का उपयोग करके खोज सकते हैं जिससे यह खोज आसान हो जाता है।

public static void main(string[] args) 
{ 
List names = new List(); 

names.Add(“Saurabh”); 
names.Add("Garima"); 
names.Add(“Vivek”); 
names.Add(“Sandeep”); 

string stringResult = names.Find(name => name.Equals(“Garima”)); 
} 
22

क्या आप यही पूछ रहे हैं?

int[] numbers = { 1, 2, 3 }; 
numbers.ToList().ForEach(n => Console.WriteLine(n)); 
+0

हां। यह आसान है और मैंने इसका इस्तेमाल किया है। +1। उस समय मैंने सवाल पूछा कि मुझे लगता है कि जेनिक्स के साथ इस्तेमाल होने पर मैं मूल सी # लैम्ब्डा सिंटैक्स पर एक संभाल पाने की कोशिश कर रहा था। – BuddyJoe

+0

ठीक है, लेकिन हमें यह मानना ​​है कि ToList() एक ओ (एन) ऑपरेशन –

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

... और यह thusly फोन:

myList.Each(x => { x.Enabled = false; }); 
+1

एक प्लस प्रत्येक में एकाधिक ऑपरेशन करने का तरीका दिखाने के लिए है। – Amir978

1

वहाँ बाहर डाल करने के लिए किसी को वहाँ क्योंकि एक विस्तार एक विस्तार पद्धति के रूप में एक जवाब प्रदान करता है, तो के बारे में चिंता करने के लिए काफी नहीं है कि चाहते हैं विधि एक उदाहरण विधि कॉल करने के लिए बस एक अच्छा तरीका है। मैं समझता हूं कि आप एक्सटेंशन विधि का उपयोग किए बिना जवाब चाहते हैं। भले ही विधि को स्थैतिक, उदाहरण या एक्सटेंशन के रूप में परिभाषित किया गया हो - परिणाम वही है।

नीचे दिया गया कोड एक विस्तार विधि और एक उदाहरण विधि को परिभाषित करने के लिए स्वीकृत उत्तर से कोड का उपयोग करता है और आउटपुट दिखाने के लिए यूनिट परीक्षण बनाता है।

public static class Extensions 
{ 
    public static void Each<T>(this IEnumerable<T> items, Action<T> action) 
    { 
     foreach (var item in items) 
     { 
      action(item); 
     } 
    } 
} 

[TestFixture] 
public class ForEachTests 
{ 
    public void Each<T>(IEnumerable<T> items, Action<T> action) 
    { 
     foreach (var item in items) 
     { 
      action(item); 
     } 
    } 

    private string _extensionOutput; 

    private void SaveExtensionOutput(string value) 
    { 
     _extensionOutput += value; 
    } 

    private string _instanceOutput; 

    private void SaveInstanceOutput(string value) 
    { 
     _instanceOutput += value; 
    } 

    [Test] 
    public void Test1() 
    { 
     string[] teams = new string[] {"cowboys", "falcons", "browns", "chargers", "rams", "seahawks", "lions", "heat", "blackhawks", "penguins", "pirates"}; 

     Each(teams, SaveInstanceOutput); 

     teams.Each(SaveExtensionOutput); 

     Assert.AreEqual(_extensionOutput, _instanceOutput); 
    } 
} 

काफी सचमुच, केवल एक चीज आप एक उदाहरण विधि के लिए एक विस्तार विधि परिवर्तित करने के लिए क्या करने की जरूरत static संशोधक और विधि के पहले पैरामीटर को निकालने के लिए है।

इस विधि

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

public void Each<T>(Action<T> action) 
{ 
    foreach (var item in items) 
    { 
     action(item); 
    } 
} 
संबंधित मुद्दे