2009-02-25 8 views
8

अब हमारे पास LINQ के लिए जबरदस्त कार्यक्षमता है, मुझे आश्चर्य है कि कौन सा वाक्यविन्यास बेहतर है। उदाहरण के लिए, मैंने पाया पद्धति का अनुसरण (बस सोचा था कि यह एक अच्छा उदाहरण था):लूप को प्रतिस्थापित करने के लिए LINQ का उपयोग करना बुद्धिमानी है?

foreach (FixtureImageServicesData image in _fixture.Images) 
{ 
    if (image.Filename != _selectedFixtureImage.Filename && image.IsPrimary) 
    { 
     image.IsPrimary = false; 
     image.IsChanged = true; 
    } 
} 

तो हम इसे एक LINQ दृष्टिकोण को बदलने के लिए थे, यह इस प्रकार दिखाई देगा (परीक्षण नहीं):

_fixture.Images.Where(x => x.Filename != _selectedFixtureImage.Filename && x.IsPrimary).ForEach(x => { x.IsPrimary = false; x.IsChanged = true; }); 

आप कौन सा देखें और बनाए रखना चाहते हैं? क्या यह पागल या प्रतिभा है?

उत्तर

22

एक ForEach विस्तार पद्धति का उपयोग करना ठीक है, लेकिन वहाँ एक मध्यवर्ती दृष्टिकोण है:

// Rename 'query' to something meaningful :) 
var query = _fixture.Images 
        .Where(image => _selectedFixtureImage.Filename 
            && image.IsPrimary); 

foreach (FixtureImageServicesData image in query) 
{ 
    image.IsPrimary = false; 
    image.IsChanged = true; 
} 

आप एक ForEach विधि का उपयोग कर हैं, तो मैं निश्चित रूप से यह कई लाइनों में से प्रारूप चाहते हैं:

_fixture.Images 
    .Where(image => _selectedFixtureImage.Filename && image.IsPrimary) 
    .ForEach(image => { image.IsPrimary = false; image.IsChanged = true;}); 

(रैपिंग से बचने के लिए कम इंडेंटेशन ...)

या:

_fixture.Images 
     .Where(image => _selectedFixtureImage.Filename && image.IsPrimary) 
     .ForEach(image => { image.IsPrimary = false; 
          image.IsChanged = true; }); 

तुम भी एक अलग विधि में "बनाने गैर-प्राथमिक" बिट को निकालने के लिए, जिस पर आप चाहते हैं बिंदु चाह सकते हैं:

_fixture.Images 
     .Where(image => _selectedFixtureImage.Filename && image.IsPrimary) 
     .ForEach(MakeNonPrimary); 
+0

मुझे नहीं लगता कि आपके बहु-पंक्ति उदाहरणों में होना चाहिए कहां बयान के बाद एक अर्धविराम। –

+0

@ जोएल: फिक्स्ड, धन्यवाद। –

1

कोई भी चीज जो लम्बवत या क्षैतिज जटिलता को कम एक है मेरे लिए प्लस इसके अतिरिक्त, लिंक जो आप पूरा करने की कोशिश कर रहे हैं उसके बारे में अधिक वर्णनात्मक है।

2

यह मुझे थोड़ा सा "मुझे रेगेक्स या मानक स्ट्रिंग फ़ंक्शंस का उपयोग करना चाहिए" या "क्या मुझे XML को बदलने या SelectSingleNode() का उपयोग करने के लिए XSLT/XPATH का उपयोग करना चाहिए"।

पहला विकल्प (यानी रेगेक्स/एक्सएसएलटी/लिंक) अक्सर किसी भी व्यक्ति द्वारा अधिक सुरुचिपूर्ण और शक्तिशाली माना जाता है जिसने इसे सीखने में कुछ समय बिताया है।

जबकि दूसरे विकल्प के लिए यह दूसरी पिक्चर (यानी स्ट्रिंग फ़ंक्शन, सिलेक्शनिंग नोड(), सरल फोरैच लूप) की तुलना में कम पठनीय और अधिक जटिल प्रतीत होता है।

अतीत में मुझे अपने डिजाइन में रेगेक्स और एक्सएसएलटी/XPATH का उपयोग करके अधिक जटिलताओं का आरोप लगाया गया है।

बस हाल ही में मैं (और यहां तक ​​के लिए) आसान foreach पसंद करते हैं द्वारा की जा रही "परिवर्तन से डरती थी," आरोप लगाया गया था Linq से अधिक कई स्थितियों में लूप कहाँ, Foreach आदि

मैं जल्द ही एहसास हुआ कि दोनों ही मामलों में लोग हैं, जो ने कहा कि यह ऐसा ही था जो महसूस करता है कि सबकुछ करने का "एक तरीका" है।

जबकि मुझे हमेशा यह पता चला है कि प्रत्येक स्थिति को अपनी योग्यता पर विचार करना और नौकरी के लिए सही उपकरण चुनना बहुत चालाक है। मैं बस उन्हें अनदेखा करता हूं और अपने दृष्टिकोण के साथ जारी रहता हूं;)

उस स्थिति के लिए आप वर्णन करते हैं, पहला विकल्प मेरे लिए अधिक बेहतर है। हालांकि, मैं संभवतः लिंक दृष्टिकोण का उपयोग करूंगा यदि मेरी टीम लिंकक में सभी सक्षम थी, और हमने बड़े एक-लाइनर से बचने के लिए दिशानिर्देशों को कोडिंग किया था (इसे विभाजित करके)

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

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