2009-02-20 9 views
5

बड़ा विषय प्रश्न: मैं अक्सर ऑब्जेक्ट्स के एक सेट को फ़िल्टर करने के लिए LINQ का उपयोग करके खुद को ढूंढता हूं और फिर, क्वेरी के बाद, प्रत्येक परिणाम पर एक क्रिया करने के लिए एक पुरानी फैशन फोरच कर रहा हूं। क्या इन दो कार्यों को संयोजित करने का कोई अच्छा तरीका है कि प्रत्येक ऑब्जेक्ट पर एक क्रिया की जाती है जो कहां से() भविष्यवाणी करता है? लगभग चयन में एक क्रिया पारित करने की तरह()। शायद यह संकलित नहीं होगा, लेकिन एक फनक में गुजरने के बारे में क्या है जो एक बूल देता है, तो आप घोंसला कर सकते हैं कि किसी अन्य क्वेरी के अंदर जो असफलताओं या सफलताओं के साथ कुछ कर सकता है। क्या किसी ने इसे उत्पादन कोड में किया है? क्या यह बुरा अभ्यास माना जाएगा? कोई अन्य विचार?क्या LINQ का उपयोग करने के लिए LINQ का उपयोग करना और केवल डेटा चुनने के बजाय क्रियाएं करना बुरा व्यवहार है?

उत्तर

8

List<T> में ForEach() विधि है जो इसके लिए डिज़ाइन की गई है।

+0

मैंने अपनी खुद की विस्तार विधि को प्रत्येक() को IENumerable पर जोड़ा है जो वही करता है। –

2

आप IEnumerable पर ForEach विधि को एक एक्सटेंशन लागू कर सकते हैं।

11

बहुत से लोग एक ForEach विधि के लिए कहा है - और वास्तव में यह उपयोगी है (जो कारण है कि हम MoreLINQ में एक मिल गया है)। यह भी संभावित खतरनाक है।

अधिकांश LINQ दृढ़ता से दुष्प्रभावों को हतोत्साहित करता है। वे संभव हैं, लेकिन निराश हैं। यही कारण है कि ऑर्डरबी आदि मौजूदा लोगों को सॉर्ट करने के बजाय नए संग्रह लौटाते हैं।

अब ForEach पर विचार करें - यह एक फ़ंक्शन के बजाय "कार्रवाई" है, जिसमें यह कुछ भी वापस नहीं करता है। यदि इसका कोई दुष्प्रभाव नहीं है, तो यह बिल्कुल व्यर्थ है! तो, यह LINQ के दर्शन के हिस्से के खिलाफ चला जाता है - यह मूल रूप से एक कार्यात्मक शैली में चीजों के करीब नहीं आ रहा है।

मैं वास्तव में या उसके खिलाफ मामला बनाने की कोशिश नहीं कर रहा हूं, वास्तव में, मुझे लगता है कि एक उपयोगी बात है, और मुझे आश्चर्य नहीं है कि यह में कई पुस्तकालयों आदि है। यह एक बहुत स्पष्ट है जोड़ने के लिए छद्म ऑपरेटर। बस आप जो कर रहे हैं उसके बारे में सोचें, और इस तथ्य को ध्यान दें कि आप साइड इफेक्ट्स पेश कर रहे हैं। यह LINQ की कार्यात्मक शैली और कोडिंग की एक और अनिवार्य शैली के बीच एक सीमा है।

+0

मुझे अभी तक MoreLINQ के बारे में पता नहीं था। अब इसका संदर्भ दिया गया है, और आपके होमग्राउन के बजाय आपके फॉरएच का उपयोग किया जाता है। Thanx! –

+0

इस बारे में महान स्पष्टीकरण कि यह IENumerable पर क्यों लागू नहीं किया गया है। धन्यवाद! – Thomas

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

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