2009-05-13 15 views
47

संभव डुप्लिकेट का उपयोग कर अभिव्यक्ति:
Why is there not a ForEach extension method on the IEnumerable interface?लैम्ब्डा Foreach खण्ड

संपादित

संदर्भ के लिए, ब्लॉग पोस्ट जो eric टिप्पणी में करने के लिए referrrred है

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

एक जिज्ञासा की मूल

अधिक मुझे लगता है लेकिन सी # विशिष्टता savants के लिए एक ...

ऐसा क्यों है कि foreach() खंड काम नहीं करता है (या नहीं है उपलब्ध) IQueryable/IEnumerable परिणाम सेट पर उपयोग के लिए ...

आपको पहले अपने परिणाम ToList() या ToArray() को परिवर्तित करना होगा, संभवतः सी # iterumerables बनाम सी # को एक तकनीकी सीमा है। सूचीबद्ध करता है ... क्या यह Inumerables/IQuerable संग्रहों के डिफरर्ड निष्पादन के साथ कुछ करना है। उदा।

var userAgentStrings = uasdc.UserAgentStrings 
    .Where<UserAgentString>(p => p.DeviceID == 0 && 
          !p.UserAgentString1.Contains("msie")); 
//WORKS    
userAgentStrings.ToList().ForEach(uas => ProcessUserAgentString(uas));   

//WORKS 
Array.ForEach(userAgentStrings.ToArray(), uas => ProcessUserAgentString(uas)); 

//Doesn't WORK 
userAgentStrings.ForEach(uas => ProcessUserAgentString(uas)); 
+4

मैं 'ForEach (uac => ProcessUserAgentString (uas))' 'EEach (ProcessUserAgentString) 'के रूप में लिखूंगा। –

+1

प्रत्येक लूप के लिए पारंपरिक के साथ क्या समस्या है? foreach (UserAgentStrings में var uas) ProcessUserAgentString (uas); – Dario

+0

कोई समस्या नहीं है ...जैसे मैंने कहा, यह एक उत्सुकता थी कि सम्मेलन Arrays/सूचियों पर उपयोग करने के लिए क्यों उपलब्ध था, लेकिन IQueryables/IEnumerables पर नहीं और जैसे एरिक लिपर्ट ने नीचे बताया, यह देव टीम द्वारा पूरी तरह से दार्शनिक पसंद है, न कि तकनीकी कारणों से –

उत्तर

55

क्या एक अद्भुत संयोग है, मैं तो बस अब लिखा था इस सवाल के बारे में एक ब्लॉग लेख। यह was published May 18th होगा। कोई तकनीकी कारण नहीं है कि हम (या आप!) ऐसा क्यों नहीं कर सके। कारण दार्शनिक क्यों नहीं हैं। मेरे तर्क के लिए अगले सप्ताह मेरे ब्लॉग देखें।

+1

मुझे नहीं लगता कि आप क्यों नहीं सोचते कि यह उपयोगी है जब विधियों का एक गुच्छा एक साथ हो। जहां (...)। चुनें (...)। ForEach (...); – Micah

+5

@ मिकाह: मेरे लेख में मैंने जो कारण दिया वह अस्पष्ट था? मुझे विश्वास है कि यह उपयोगी है। मेरा मानना ​​है कि यह काम करने की गारंटी देने के लिए * अपर्याप्त रूप से उपयोगी * है, और यह खराब कोडिंग प्रथाओं को प्रोत्साहित करता है जैसे कि तर्कसंगत रूप से प्रश्नों की तरह दिखने वाले दुष्प्रभावों को एम्बेड करना। इस विधि को जोड़ने के लिए अकेले कारण पर्याप्त नहीं है। –

+0

@EricLippert यह सब के बाद क्यों जोड़ा गया है? –

13

यह IEnumerable<T> के लिए एक ForEach विस्तार विधि लिखने के लिए पूरी तरह से संभव है।

  • क्योंकि ForEach हो सकता है कि पहले से ही List<T> और Array पर मौजूद LINQ करने से पहले:

    मैं सच में यकीन है कि क्यों यह एक अंतर्निहित विस्तार पद्धति के रूप में शामिल नहीं है नहीं कर रहा हूँ।

  • शायद क्योंकि यह अनुक्रम को फिर से शुरू करने के लिए foreach लूप का उपयोग करना आसान है।
  • शायद क्योंकि यह कार्यात्मक/LINQy पर्याप्त महसूस नहीं किया गया था।
  • शायद क्योंकि यह श्रृंखला योग्य नहीं है। (यह एक कदम उठाने के बाद कि yield रों प्रत्येक आइटम एक chainable संस्करण बनाने के लिए बहुत आसान है, लेकिन वह व्यवहार विशेष रूप से सहज नहीं है।)

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); 
    } 
} 
+0

बिंदु लिया गया, लेकिन सवाल यह है कि यह बॉक्स के बाहर क्यों उपलब्ध नहीं है इसके संदर्भ में अधिक था ... यानी ऐरे में स्थिर 'फॉरएच()' विधि है। सूची में एक है ... क्यों नहीं Inumerable/IQueryable –

+0

मुझे लगता है कि हमें वास्तविक उत्तर खोजने के लिए एरिक के ब्लॉग पोस्ट की प्रतीक्षा करनी होगी;) – LukeH

+0

आपके अनुमान मेरे पोस्टिंग के समान ही हैं। –