2013-05-16 2 views
14

मैं निम्नलिखित प्रश्न हैं:LINQ के अंदर मान निर्दिष्ट करना?

drivers.Select(d => { d.id = 0; d.updated = DateTime.Now; return d; }).ToList(); 

ड्राइवरों एक सूची है जो विभिन्न पहचान-पत्र और अद्यतन मूल्यों के साथ में आता है, इसलिए मैं चयन में मूल्यों में परिवर्तन कर रहा हूँ, लेकिन यह करने के लिए उचित तरीका है। मैं पहले से ही पता है कि मैं ड्राइवरों के लिए ड्राइवरों फिर नियत नहीं कर रहा हूँ क्योंकि Resharper इसके बारे में शिकायत है, तो मुझे लगता है कि यह बेहतर होगा अगर यह था:

drivers = drivers.Select(d => { d.id = 0; d.updated = DateTime.Now; return d; }).ToList(); 

लेकिन यह अभी भी जिस तरह से किसी में प्रत्येक तत्व के लिए नए मान निर्दिष्ट करना चाहिए ड्राइवर सूची?

+0

[लिंक साइड इफेक्ट्स] के संभावित डुप्लिकेट (http: // stackoverflow।कॉम/प्रश्न/5632222/linq-side-effects) – nawfal

उत्तर

33

हालांकि यह निर्दोष दिखता है, विशेष रूप से ToList कॉल के साथ संयोजन में जो कोड तुरंत निष्पादित करता है, मैं निश्चित रूप से किसी प्रश्न के हिस्से के रूप में कुछ भी संशोधित करने से दूर रहूंगा: चाल इतनी असामान्य है कि यह आपके प्रोग्राम के पाठकों को यात्रा करेगी , यहां तक ​​कि अनुभवी वाले, खासकर यदि उन्होंने पहले कभी नहीं देखा।

foreach छोरों के साथ गलत कुछ भी नहीं है - सच है कि आप LINQ के साथ यह कर सकते हैं कि इसका मतलब यह नहीं है कि आप चाहिए यह कर रहा।

+0

मैं सिंगल लाइन स्टेटमेंट के लिए 'ForEach' का उपयोग करूंगा, ऐसा कुछ नहीं जिसके लिए घुंघराले ब्रेसिज़ (एकाधिक कथन) की आवश्यकता होती है। 'foreach' वास्तव में यहाँ बेहतर है। – nawfal

+0

आप सही हैं, यह मुझे फिसल गया :) मैं आपके दूसरे कथन से भी सहमत हूं। – Xaisoft

+8

+1 LINQ ऑब्जेक्ट उत्परिवर्तन के लिए उपयोग नहीं किया जाना चाहिए। – recursive

28

यह कभी नहीं करें। एक प्रश्न क्वेरी होना चाहिए; यह गैर-विनाशकारी डेटा स्रोत के प्रश्न पूछना चाहिए। यदि आप साइड इफेक्ट का कारण बनना चाहते हैं तो foreach लूप का उपयोग करें; यही वह है जो इसके लिए है। नौकरी के लिए सही उपकरण का उपयोग करें।

+4

धन्यवाद एरिक। सही तरीके से जानने का एकमात्र तरीका यह जानना है कि आप इसे पहले स्थान पर गलत कर रहे हैं :) – Xaisoft

7

ठीक है, मैं खुद जवाब दूंगा।

Xaisoft, Linq प्रश्न, यह लैम्ब्डा अभिव्यक्ति या क्वेरी अभिव्यक्ति हो, सूची को उत्परिवर्तित करने के लिए उपयोग नहीं किया जाना चाहिए। इसलिए आपके Select

drivers = drivers.Select(d => { d.id = 0; d.updated = DateTime.Now; return d; }).ToList(); 

खराब शैली है। यह मानक/मानक नहीं है, मानक नहीं है, और Linq दर्शन के खिलाफ। अंतिम परिणाम को प्राप्त करने का एक और गरीब शैली है:

drivers.Any(d => { d.id = 0; d.updated = DateTime.Now; return false; }); 

लेकिन वह नहीं कहना ForEachList<T> पर अनुचित है। यह आपके जैसे मामलों में उपयोग पाता है, लेकिन Linq क्वेरी के साथ उत्परिवर्तन मिश्रण नहीं करता है। मैं कुछ लिखना पसंद करता हूं:

drivers.ForEach(d => d.updated = DateTime.Now); 

इसकी सुरुचिपूर्ण और समझदार। चूंकि यह Linq से निपटता नहीं है, यह भी भ्रमित नहीं है। मुझे लैम्बडा के अंदर कई कथन (आपके मामले में) के लिए उस वाक्यविन्यास को पसंद नहीं है। चीजें जटिल होने पर यह थोड़ा कम पठनीय और डीबग करने के लिए कठिन होता है। आपके मामले में मैं सीधे foreach लूप पसंद करता हूं।

foreach (var d in drivers) 
{ 
    d.id = 0; 
    d.updated = DateTime.Now; 
} 

व्यक्तिगत तौर पर मैं ForEachIEnumerable<T>as a terminating call to Linq expression पर की तरह (यानी, काम एक प्रश्न लेकिन एक निष्पादन होना नहीं है)।

+0

अच्छी व्याख्या के लिए धन्यवाद। – Xaisoft

+0

@Xaisoft वास्तव में जिस चीज़ को मैं 'फॉरएच' के बारे में नफरत करता हूं 'सूची ' यह तथ्य है कि वे डिफ़ॉल्ट रूप से दिखाई देते हैं। मुझे लगता है कि यह ढांचे के स्तर के निर्माण के रूप में फिट नहीं है। मैं विस्तार के रूप में, उपयोगकर्ता के विवेकाधिकार में आने वाले ऐसे उच्च स्तरीय संरचनाओं को पसंद करता हूं। यदि दर्जे की चीजें अंतिम उपयोगकर्ता की सहायता करती हैं, तो इसके लिए अच्छी तरह से जाएं। वहाँ बहुत geeky वहाँ जा रहा है और यह व्यक्तियों के लिए यह चुनने के लिए है कि इसका उत्पादन फिट है या नहीं। [यहां 'टाइप'' के लिए लागू एक और 'स्विच-केस' है, (http://stackoverflow.com/a/1426626/661933) अच्छी तरह से यह शानदार है। इसे गले लगाओ या दूर हो जाओ। इसके बारे में कुचलना मत करो .. – nawfal

+0

इसके बारे में कुचलने वाला कौन है और यह क्या है? – Xaisoft

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