2012-04-24 11 views
44

मैंने हाल ही में विंडोज 8 मेट्रो में डबलिंग शुरू कर दी, और पाया कि मेरे पुराने दोस्तों में से एक गायब हो गया है।सूची <T> है .एच() विधि चली गई?

मैं पारंपरिक foreach() निर्माण का उपयोग करने से अधिक .ForEach() विधि का उपयोग करता हूं, और मुझे बहुत जल्दी एहसास हुआ कि यह विधि उपलब्ध नहीं है। उदाहरण के लिए, इस कोड को एक मेट्रो एप्लिकेशन के तहत संकलित कर देगा नहीं:

var list = new List<string>(); 

list.ForEach(System.Diagnostics.Debug.WriteLine); 

मैं अगर मैं इस के किसी भी चर्चा मिल सकता है देखने के लिए खोज की है, लेकिन करने के लिए सक्षम नहीं था। क्या मैं अभी उलझ रहा हूं, या वास्तव में यह चला गया है?

+3

आईन्यूमेरेबल में कभी भी फॉरएच एक्सटेंशन विधि नहीं थी, केवल IList में यह – Clueless

+0

है, आप सही हैं। मैं समय से सामान्य था। मैं प्रश्न शीर्षक बदल दूंगा। – Robaticus

+0

मैंने वही गलती की - शीर्षक कहता है INumerable लेकिन उदाहरण स्पष्ट रूप से एक सूची पर इसका प्रयास कर रहा है। संपादित करें: शीर्षक अद्यतन :-) – yamen

उत्तर

42

It's indeed gone:

सूची < टी > .ForEach मेट्रो शैली क्षुधा में हटा दिया गया है। हालांकि विधि सरल लगती है, जब फॉरएच को पारित विधि द्वारा सूची को उत्परिवर्तित किया जाता है तो इसमें कई संभावित समस्याएं होती हैं। इसके बजाए यह अनुशंसा की जाती है कि आप केवल फ़ोरैच लूप का उपयोग करें।


वेस हैगर्ड | .NET फ्रेमवर्क टीम (बीसीएल) | http://blogs.msdn.com/b/bclteam/

बहुत अजीब, तथापि, यह documentation में दिखाई देते हैं, जिसमें कहीं यह राज्य है कि इस विधि विंडोज स्टोर ऐप्लिकेशन के लिए नेट में समर्थित नहीं है (पूर्व में मेट्रो शैली क्षुधा के लिए नेट) बनाता है । शायद यह प्रलेखन टीम के हिस्से पर सिर्फ एक निरीक्षण है।

+1

@Robaticus: आप इसे बदलने के लिए बस अपनी खुद की विस्तार विधि जोड़ सकते हैं। शायद 'टॉलिस्ट()' पहले कॉल करने के लिए सबसे अच्छा होगा, फिर इसे फिर से करें। अपने दिन को बर्बाद करने के लिए इसे बदलने की कोशिश करते समय स्रोत को पुन: स्थापित करने की तरह कुछ भी नहीं। – Will

+1

@Will - मैं सहमत हूं कि मैं इसे कर सकता हूं। हालांकि, बाहर निकलने के लिए शायद यह एक अच्छी आदत है, खासकर जब नए LINQ प्रोग्रामर को चीजें कैसे करें। – Robaticus

16

एक वैकल्पिक यह अपने आप निश्चित रूप से परिभाषित करने के लिए है:

public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumeration, Action<T> action) 
{ 
    foreach(T item in enumeration) 
    { 
     action(item); 
     yield return item; 
    } 
} 

क्रेडिट: LINQ equivalent of foreach for IEnumerable<T>

(नोट: एक नकली नहीं)

+2

हालांकि यह निश्चित रूप से स्वीकार्य अभ्यास है, बस सावधान रहें कि यह पिछले आईनेमरेबल कॉल (जैसे कहां या ऑर्डरबी) की किसी भी आवश्यकता को संशोधित नहीं करता है। साथ ही, यदि आप IENumerable कॉलों को चेन करना जारी रखना चाहते हैं, तो आप आइटम पर कार्रवाई करने के बाद रिटर्न प्रकार को 'IENumerable ' और 'उपज वापसी आइटम 'में बदल सकते हैं। हालांकि, यह अभी भी तत्वों को बदल देगा, इसलिए ध्यान रखें कि ये "साइड इफेक्ट्स" गणना को बदल सकता है। – SPFiredrake

+0

हां, के लिए निश्चित रूप से खतरनाक है। मैंने लगातार चेनिंग की अनुमति देने के लिए 'IENumerable 'वापस करने के लिए उत्तर अपडेट किया है, लेकिन संभवतः यह चीजों को और अधिक खतरनाक बनाने की संभावना है। – yamen

18

के लिए क्यों यह अब हो सकता है समझ प्राप्त करने के इसमें शामिल है, इस पोस्ट को माइक्रोसॉफ्ट पर सी # टीम पर काम करने वाले व्यक्ति द्वारा पढ़ें: http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

असल में, यह दर्शन है। "LINQ" विशेषताएं कार्यात्मक प्रोग्रामिंग प्रतिमान से अत्यधिक प्रेरित होती हैं, और फॉरएच एक्सटेंशन उस के चेहरे पर उड़ता है ... यह खराब कार्यात्मक शैली को प्रोत्साहित करता है।

+0

जोएल: मुझे समय-समय पर सामान्य मिला और आईनेमेरेबल की बजाय सूची को प्रतिबिंबित करने के लिए शीर्षक बदल दिया। – Robaticus

+8

"कोई ऐसा व्यक्ति जो माइक्रोसॉफ्ट में सी # टीम पर काम करता है" कितना सूक्ष्म ... – BoltClock

+9

अहह, यह सिर्फ लिपर्ट लड़का है। वह बिल्ली क्या जानता है? ;) – Robaticus

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