2010-03-24 8 views
9

जब LINQ के लिए एक विधि श्रृंखला लेखन, मैं कहां से बयान कर सकते हैं दो तरीकों में से एक:लिंक जहां क्लॉज - स्टैक या गठबंधन करने के लिए बेहतर है?

var blackOldCats = cats.Where(cat => cat.Age > 7 && cat.Colour == "noir") 

या

var blackOldCats = cats.Where(cat => cat.Age > 7).Where(cat => cat.Colour == "noir") 

वहाँ एक दूसरे के ऊपर के किसी भी लाभ हैं?

इस उदाहरण में डेटाटाइप्स बारे में बहुत ज्यादा चिंता मत करो, लेकिन अगर वहाँ डेटाटाइप्स में समस्याएं हैं, तो वह भी पता करने के लिए अच्छा होगा।

स्पष्ट है कि एक वस्तु पहले से ही संदर्भित है, सही है, ताकि दो गुण आवेदन पर एक ही बार में है आसान मारा?

+0

जब आप के बारे में लाभ आप प्रदर्शन, पठनीयता या कुछ और करने के लिए बात कर रहे हैं पूछना? – Kane

+0

पठनीयता को छोड़कर कोई लाभ, क्योंकि दोनों मेरे पीओवी – Dann

उत्तर

3

आपके उदाहरण में वे वही हैं और वे व्यक्तिगत वरीयता का विषय हैं। LINQ के स्थगित निष्पादन के कारण, संग्रह केवल एक बार फिर से किया जाएगा।

यदि आप एक या ऑपरेटर का उपयोग करके अपनी अभिव्यक्तियों को जोड़ना चाहते हैं, तो आप केवल पहले का उपयोग कर सकते हैं।

+0

में काफी पठनीय हैं, मुझे एहसास नहीं हुआ कि LINQ इस तरह काम करता है (हालांकि अब समझ में आता है)। मैं सोच रहा था कि संयुक्त तुलना की तुलना में पहला सबसे तेज़ होगा। हैप्पी मैंने अभी यह क्यू रखा है। – Dann

0

पहला थोड़ा तेज होगा क्योंकि इससे कुछ हद तक ओवरहेड कम हो जाता है। इसके अलावा वे मूल रूप से उसी तरह से संसाधित होते हैं।

एक उल्लेखनीय अंतर, हालांकि, Color संपत्ति की तुलना दूसरे उदाहरण में Age संपत्ति से पहले की जाती है। आप शॉर्ट सर्किट के लिए एक सस्ता तुलना एक और अधिक महंगी एक चाहते हैं (ताकि Color संपत्ति केवल आइटम जहां Age तुलना सच है के लिए तुलना में है), तो आप पिछले Where कॉल में सस्ता एक रखना चाहिए:

var blackOldCats = 
    cats 
    .Where(cat => cat.Colour == "noir") 
    .Where(cat => cat.Age > 7); 

इस मामले में तुलना की लागत में बहुत अंतर नहीं है, लेकिन यदि कोई दूसरे की तुलना में अधिक महंगा है तो यह जानना अच्छा होता है कि किस क्रम में उनका मूल्यांकन किया जाता है।

+2

क्या आप समझा सकते हैं कि सामने की बजाय सस्ती तुलना क्यों करें? मैं इसे दूसरे तरीके से गोल करता हूं, लेकिन केवल वृत्ति से, किसी भी अच्छे कारण के लिए नहीं। =) – Jens

+1

मैंने एक छोटा परीक्षण आवेदन लिखा, जो यहां मेरी वृत्ति की पुष्टि करता है (दो जहां खंड, एक छोटा थ्रेड ले रहा है। सो जाओ, दूसरा तेज है)। पिछले एक के परिणाम पर हर जगह कॉल निष्पादित की जाती है, इसलिए सस्ता तुलना पहली होनी चाहिए। क्या मैंने गलती की? – Jens

+0

जेन्स सही है, आपका कथन पीछे है। मैंने अभी भी एक विधि के साथ परीक्षण किया है, जब इसकी हिट होने पर कंसोल करने का अधिकार है, और अनुक्रम में विधियों को निष्पादित किया गया है, दाएं से दाएं – Dann

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