2010-07-07 15 views
21

में प्रत्येक ऑब्जेक्ट पर एक विधि को कॉल करें क्या सूची में प्रत्येक ऑब्जेक्ट पर एक विधि को कॉल करने का कोई तरीका है - उदा।जेनिक्स - सूची <T>

List<MyClass> items = setup(); 

foreach (MyClass item in items) 
    item.SomeMethod(); 
के बजाय

आप में बनाया तरह

foreach(items).SomeMethod(); 

कुछ कुछ, विस्तार के तरीकों, या मैं अभी भी लानत आलसी जा रहा हूँ कर सकता है?

उत्तर

41

हाँ, List<T> पर, वहाँ है:

items.ForEach(item => item.SomeMethod()) 

विषमता है कि इस List<T> पर ही उपलब्ध है, नहीं IList<T> या IEnumerable<T>

इसे ठीक करने के, मैं जोड़ना चाहते है निम्नलिखित विस्तार विधि:

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

फिर, आप इसे किसी भी चीज़ पर उपयोग कर सकते हैं जो IEnumerable<T> लागू करता है ... न केवल List<T>

+0

मुझे कैसे याद आया। प्रत्येक ... आज मेरे दिन का सारांश! अच्छा विस्तार विधि। – Ryan

15
items.ForEach(i => i.SomeMethod()); 
+0

क्या यह 4.0 में नया है? –

+1

@Rosarch: नहीं। http://msdn.microsoft.com/en-us/library/bwabdf9z.aspx ध्यान दें कि कोडरशश इसे foreach (आइटम्स में var x) x.omeMethod() से एक परिवर्तन के रूप में सुझाएगा; –

+0

@ ब्रायन जेनिसियो या मुझे लगता है कि मैंने आपकी टिप्पणी के रूप में एक ही समय में देखा/तय किया है ... –

4

सूचियों में ForEach विधि है। आप एक आईनेमरेबल एक्सटेंशन विधि भी बना सकते हैं, but it kind of goes against the spirit of Linq

+0

बेशक, उस पोस्ट पर टिप्पणी करने वालों में से एक के रूप में, कभी-कभी फॉरएच के लिए कोई (साफ) विकल्प नहीं होता है। हालांकि, अगर यह सिर्फ कंटेनर में _every_ ऑब्जेक्ट पर एक या दो विधियों को कॉल करने के लिए है, क्लासिक फोरैच का उपयोग करना वास्तव में जाने का तरीका है। –

1

आप MyMethod का उपयोग कर MyClass पर एक संपत्ति को बदलने की जरूरत है, तो जॉन स्कीट के morelinq library

items = items.Pipe<MyClass>(i => i.Text = i.UpdateText()).ToList() 

संभावनाएं अनंत हैं से 'पाइप' विधि का उपयोग करें! :)

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