2012-03-01 19 views
5

को समझना मैं उपज कीवर्ड को बेहतर समझने की कोशिश कर रहा हूं और मुझे लगता है कि मेरे पास इसकी पर्याप्त समझ है, इसलिए मैंने कुछ परीक्षण चलाए, हालांकि परिणाम से मुझे आश्चर्य हुआ।उपज कीवर्ड और LINQ

अगर मैं नीचे दिए गए कोड मैं निम्नलिखित उत्पादन जो दिखाता है कि यह सिर्फ संख्या तक नहीं पूरी श्रृंखला से अधिक लूप मिल चलाने 4.

public void DoIt() 
    { 
     Console.WriteLine("Method Call"); 
     var results = GetData(Enumerable.Range(1, 10)); 
     Console.WriteLine("LINQ"); 
     var filtered = results.Where(x => x == 4); 
     Console.WriteLine("Start result loop"); 
     foreach (var item in filtered) 
     { 
       Console.WriteLine("Item is " + item); 
     } 
    } 

    private IEnumerable<int> GetData(IEnumerable<int> Input) 
    { 
     foreach (int item in Input) 
     { 
      if (item % 2 == 0) 
      { 
       Console.WriteLine("Found " + item); 
       yield return item; 
      } 
     } 
    } 

आउटपुट:

Method Call 
LINQ 
Start result loop 
Found 2 
Found 4 
Item is 4 
Found 6 
Found 8 
Found 10 

हैं मैं नीचे कोड चलाता हूं यह दिखाता है कि यह केवल 4 तक पहुंच जाता है और फिर बंद हो जाता है।

public void DoIt() 
    { 
     Console.WriteLine("Method Call"); 
     var results = GetData(Enumerable.Range(1, 10)); 
     Console.WriteLine("Start result loop"); 
     foreach (var item in results) 
     { 
      if (item == 4) 
      { 
       Console.WriteLine("Item is " + item); 
       break; 
      } 
     } 
    } 

    private IEnumerable<int> GetData(IEnumerable<int> Input) 
    { 
     foreach (int item in Input) 
     { 
      if (item % 2 == 0) 
      { 
       Console.WriteLine("Found " + item); 
       yield return item; 
      } 
     } 
    } 

आउटपुट:

Method Call 
Start result loop 
Found 2 
Found 4 
Item is 4 

मुझे लगता है कि मैं कुछ understading नहीं कर रहा हूँ, लेकिन के रूप में अगर LINQ क्या मैं इसे करने की उम्मीद के विपरीत कर रहा है यह लग रहा है? हालांकि, LINQ ने उपज और स्थगित निष्पादन का भी उपयोग किया था और मैं उम्मीद करता हूं कि कोड के दूसरे सेट के परिणाम कोड के पहले सेट के लिए समान होंगे।

+0

'कहां परिणाम फ़िल्टर करते हैं, जब कोई आइटम भविष्यवाणी को संतुष्ट करता है तो यह परिणाम लौटने से नहीं रोकता है। दूसरी तरफ, जब आपका पूर्वानुमान संतुष्ट हो जाता है तो आपका मैनुअल 'foreach' लूप टूट जाता है ... –

उत्तर

12

यह स्थगित निष्पादन का उपयोग करता है। LINQ Where इनपुट के सभी तत्वों को समेकित करता है, यह तब पाया जाता है जब यह पहले तत्व में नहीं मिलता है। यही First करता है।

आपका पहला उदाहरण दूसरे उदाहरण के समान होगा यदि आपने Where से First को बदल दिया है, या यदि आपने दूसरे उदाहरण से break हटा दिया है।

2

मुझे लगता है कि आपको अपना मूल तर्क गलत है, LINQ नहीं। आपके पहले उदाहरण को पूरी श्रृंखला में फिर से शुरू करना है, क्योंकि जहां स्थिति को 4 के बराबर सभी मान मिलना है, न केवल पहले मान, जो कि 4 के बराबर है।

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