2010-11-23 7 views
7

वहाँ के बीच किसी भी कार्यात्मक अंतर है:ये दो linq अभिव्यक्ति कार्यात्मक रूप से समकक्ष हैं?

if (photos.Any(it => it.Archived)) 

और

if (photos.Where(it => it.Archived).Any()) 

यदि हां, तो अधिक आकर्षक एक दूसरे के ऊपर का उपयोग करने के कारण क्या है?

+0

इसका परिणाम वही होना चाहिए, लेकिन चूंकि कोई प्रदर्शन अंतर नहीं होने के बारे में 100% निश्चित नहीं है, इसलिए मैं इसे जाने दूंगा और किसी को इस पोस्ट पर एक निश्चित उत्तर देने दूंगा। –

+0

विजुअल स्टूडियो में आप स्वयं आईएल की जांच कर सकते हैं। कृपया funktion –

उत्तर

8

कार्यात्मक वे एक ही बात करते हैं। प्रदर्शन की विशिष्ट प्रदाता पर निर्भर करता है, लेकिन LINQ में उदाहरण SQL करने के लिए दोनों रूपों में ठीक उसी एसक्यूएल उत्पादन:

SELECT 
    (CASE 
     WHEN EXISTS(
      SELECT NULL AS [EMPTY] 
      FROM [dbo].[photos] AS [t0] 
      WHERE [t0].[Archived] = 1 
      ) THEN 1 
     ELSE 0 
    END) AS [value] 

मैं के रूप में यह थोड़ा और अधिक करने के लिए स्पष्ट लगता है पहला विकल्प का उपयोग करें मैं एक लेने के लिए है, तो मुझे।

+1

+1 संकेत के लिए कि वास्तविक कार्यान्वयन प्रदाता के लिए है। –

+0

@ टिम जार्विस: धन्यवाद। मैंने इसे थोड़ा और स्पष्ट बनाने के लिए इसे "संकेत" से दोहराया कि यह प्रदाता विशिष्ट है। –

2

नहीं, तरीकों की वर्तमान .नेट फ्रेमवर्क लागू करने के लिए कोई फर्क नहीं व्यावहारिक अंतर है। स्थगित निष्पादन की वजह से, दोनों photos की गणना करेंगे जब तक कि यह कोई मिलान न मिले, और फिर रुक जाए। (बशर्ते कि यह लिंक-टू-ऑब्जेक्ट्स है - अन्य प्रदाता अलग-अलग व्यवहार कर सकते हैं)।

यदि आप नाइट-पिक्य प्राप्त करना चाहते हैं, तो छोटे कार्यान्वयन भिन्नताएं हैं। (आप इसे ढांचे स्रोतों में देख सकते हैं):

Any बस उस समूह का iterates foreach का उपयोग कर, जहां Where रिटर्न या तो एक WhereArrayIterator, WhereListIterator, या एक WhereEnumerableIterator संग्रह आप किस प्रकार में पास के आधार पर के रूप में मैं हेवन '। टी गहराई में इस पर ध्यान दिया, लेकिन मुझे लगता है कि यह एक सरणी या सूची के मामले में अनुकूलित करने के लिए जंजीर विस्तार विधियों को अनुमति देने के लिए किया जाता है।

दूसरे शब्दों में, जहां Any एक सरल foreach होता है, Where करता है:

if (source is TSource[]) return new WhereArrayIterator<TSource>((TSource[])source, predicate); 
    if (source is List<TSource>) return new WhereListIterator<TSource>((List<TSource>)source, predicate); 
    return new WhereEnumerableIterator<TSource>(source, predicate); 
+0

में एक ब्रेकपॉइंट मैंने सोचा कि अगर किसी दूसरे संस्करण में मामला होगा, तो मैं किसी भी तर्क को अस्वीकार कर दूंगा, लेकिन फिर मैं LINQ का इतना उपयोग नहीं करता हूं। – stonemetal

+0

दोनों शून्य पर फेंकता है। – driis

+0

आंतरिक रूपरेखा के लिए धन्यवाद। – CedricB

2

एक अभिव्यक्ति के रूप में, वे एक ही परिणाम उत्पन्न करते हैं। हालांकि, इस परिणाम को उत्पन्न करने वाली तंत्र थोड़ा अलग है। ध्यान दें कि वे दोनों मूल अनुक्रम से वस्तुओं की एक ही संख्या के माध्यम से चलते हैं।

मैं हमेशा पूर्व का उपयोग करता हूं क्योंकि यह छोटा होता है और दूसरी तरफ इसे चुनने में स्पष्टता, पठनीयता और न ही रखरखाव का कोई नुकसान नहीं होता है।

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