2009-10-07 13 views
7

कोई मिलान नहीं होने पर LINQ फ़ंक्शन वास्तव में क्या करता है? कहां विधि ले लो, उदाहरण के लिए:LINQ परिणाम जब कोई मिलान नहीं है?

var numbers = Enumerable.Range(1, 10); 
var results = numbers.Where(n => n == 50); 

इस बिंदु पर परिणाम क्या होंगे?

+3

"परिणाम" में क्या होगा * एक ऑब्जेक्ट जो क्वेरी * का प्रतिनिधित्व करता है। याद रखें: क्वेरी ऑब्जेक्ट क्वेरी का परिणाम नहीं है। क्वेरी ऑब्जेक्ट ऐसा कुछ है जिसे आप * क्वेरी के परिणाम प्राप्त करने के लिए पुन: प्रयास कर सकते हैं *, यह स्वयं नतीजे नहीं है। –

उत्तर

9

results स्वयं ही एक प्रश्न है। जब तक आप इसके माध्यम से पुनरावृत्ति शुरू नहीं करते हैं (या तो स्पष्ट रूप से या Count() जैसे कॉल के माध्यम से), कुछ भी जांच नहीं किया गया है कि कोई परिणाम हैं या नहीं। यह केवल तभी होता है जब आप इसका अनुमान लगाते हैं कि कुछ भी होगा।

तो तुम कर सकता है:

foreach (int x in results) 
{ 
    Console.WriteLine("This won't happen"); 
} 

या:

Console.WriteLine(results.Any()); // Will print false 
Console.WriteLine(results.Count()); // Will print 0 

इनमें से किसी कारण होगा विधेय रेंज में प्रत्येक मद के सामने मूल्यांकन किया जाना ... लेकिन तब से पहले, यह जीता बिलकुल नहीं बुलाया जाएगा।

यह समझने के लिए एक महत्वपूर्ण बात है, क्योंकि यह मतलब है कि resultsnull नहीं सकता है आलसी मूल्यांकन की सुविधा को बनाए रखते हुए है - जब तक आप उपयोग करने की कोशिश कीresults, यह है कि क्या यह बाहर काम नहीं होता null होना चाहिए या नहीं!

+0

मैं आलसी मूल्यांकन के बारे में सब भूल गया। * स्वयं को smacks * – jasonh

+0

ध्यान दें कि "क्वेरी" जो आप वास्तव में बोल रहे हैं वह किसी प्रकार का एक आईनेमरेबल है जिसने वास्तव में इसका डेटा पॉप्युलेट नहीं किया है ... – RCIX

2

खाली IEnumerable<T> का संदर्भ।

+0

बढ़िया! यही वह है जिसे मैं ढूंढ रहा था। मैं यह सुनिश्चित करना चाहता था कि मुझे शून्य की जांच करने की आवश्यकता नहीं है। – jasonh

+1

नाइटपिक: एक खाली IENumerable का संदर्भ - संग्रह नहीं –

+0

हाँ आप सुरक्षित हैं, यह शक्कर की भलाई है! –

4

इस मामले में यह 0 आइटमों की संख्या के साथ IEnumerable<Int32> देता है।

+4

यह इसे "जानता है" की तरह बनाता है 0 की गिनती है - जो यह नहीं करता है। लौटाया गया मूल्य एक 'आईनेमरेबल ' है, जो, जब पुनरावृत्त होता है, तो 0 आइटम उत्पन्न करेगा। यह नहीं जानता कि पहले से ही - इसे खोजने के लिए प्रत्येक मान के खिलाफ भविष्यवाणी करने की कोशिश करनी है, और जब तक आप इसे नहीं पूछते तब तक ऐसा नहीं होता है। –

+0

@ जोन: निश्चित रूप से, स्पष्टीकरण के लिए धन्यवाद। जैसा कि आपने अपनी पोस्ट में उल्लेख किया है, इसका उपयोग परिणाम निर्धारित करने के लिए किया जाना चाहिए। –

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