2008-12-02 10 views
6

एसओ पर एक अन्य प्रश्न में मैंने नीचे दिए गए कोड की तरह उत्तर दिया और एक टिप्पणी मिली कि LINQ-query का मूल्यांकन प्रत्येक के लिए प्रत्येक पुनरावृत्ति में किया गया था। क्या यह सच है?क्या यह linq क्वेरी प्रत्येक लूप के प्रत्येक पुनरावृत्ति पर चलती है?

मुझे पता है कि LINQ-querys इसकी वस्तुओं का मूल्यांकन करने से पहले निष्पादित नहीं होता है, इसलिए ऐसा लगता है कि परिणाम को पुन: सक्रिय करने के इस तरीके से यह हर पुनरावृत्ति पर चल सकता है?

Dim d = New Dictionary(Of String, String)()  
d.Add("Teststring", "Hello")  
d.Add("1TestString1", "World")  
d.Add("2TestString2", "Test")  

For Each i As String In From e In d Where e.Value.StartsWith("W") Select e.Key 
    MsgBox("This key has a matching value:" & i)  
Next 
+0

वैसे ऐसा लगता है कि आपके पास क्या ठीक है, लेकिन कम से कम लाइन के अंत के साथ प्रारूप _ इसलिए यह एक बड़ी लाइन पर नहीं है :) –

+0

हाँ। LINQ के साथ इस देर से मूल्यांकन की बात से परिचित होने में कुछ समय लगेगा। – Stefan

+0

हाँ यह करता है .. लेकिन इसे प्राप्त करने के बाद यह बहुत अच्छा है, आप कुछ सुंदर मीठी चीजें कर सकते हैं। –

उत्तर

7

नहीं ... एक foreach में, "GetEnumerator" को केवल एक बार (कभी) कहा जाता है, और इसका उपयोग आगे बढ़ रहा है।

संपादित करें: मैंने अस्थायी रूप से संग्रहीत परिणाम सेट के बारे में एक बयान दिया है ... यह केवल कुछ मामलों के लिए सच है ... यह नहीं, इसलिए मैंने इसे बाहर निकाला।

संपादित करें: कृपया ज्यादा वर्बोज़ होने के लिए इस माफ कर ... लेकिन मैं शो आप क्या हो रहा है चाहता था ... इसलिए यहाँ एक कंसोल अनुप्रयोग :)

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      foreach (string item in MyCustomEnumerator() 
       .Where(item => item.StartsWith("abc"))) 
      { 
      Console.WriteLine(item); 
      } 
     } 

     static IEnumerable<string> MyCustomEnumerator() 
     { 
      Console.WriteLine(DateTime.Now); 

      yield return "abc1"; 

      Console.WriteLine(DateTime.Now); 

      yield return "abc2"; 

      Console.WriteLine(DateTime.Now); 

      yield return "abc3"; 

      Console.WriteLine(DateTime.Now); 

      yield return "xxx"; 
     } 
    } 
} 

संपादित करें: यह में परिणाम होगा एक डेटटाइम, फिर एबीसी 1, फिर डेटटाइम, फिर एबीसी 2, फिर डेटटाइम, फिर एबीसी 3, फिर डेटटाइम।

+2

धन्यवाद। और फेव्यू। मैंने LINQ परिणामों के माध्यम से एक हालिया परियोजना में बहुत कुछ करने के लिए इस तरह का उपयोग किया। ;) – Stefan

0

मैं प्रत्येक ... अगले बयान के लिए ऊपर देखा और ऐसा लगता है विजुअल बेसिक संग्रह का मूल्यांकन करता है की तरह केवल एक बार, इससे पहले कि पाश शुरू होता है, तो यह हर यात्रा पर क्वेरी नहीं चलाना चाहिए।

Iterations की संख्या। लूप शुरू होने से पहले विजुअल बेसिक संग्रह को केवल एक बार, का मूल्यांकन करता है। यदि आपका कथन ब्लॉक तत्व या समूह बदलता है, तो ये परिवर्तन लूप के पुनरावृत्ति को प्रभावित नहीं करते हैं।

1

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

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