2009-05-05 37 views
5

this question का जवाब देने के बाद में अनंत IEnumerable मैं एक साथ निम्नलिखित सी # कोड सिर्फ मनोरंजन के लिए डाल दिया:एक foreach पाश

public static IEnumerable<int> FibonacciTo(int max) 
{  
    int m1 = 0; 
    int m2 = 1; 
    int r = 1; 

    while (r <= max) 
    { 
     yield return r; 

     r = m1 + m2; 
     m1 = m2; 
     m2 = r; 
    } 
} 

foreach (int i in FibonacciTo(56).Where(n => n >= 24)) 
{ 
    Console.WriteLine(i); 
} 

समस्या यह है कि मैं समारोह के लिए एक max पैरामीटर पारित करने के लिए की आवश्यकता होगी, पसंद नहीं है है। अभी, यदि मैं एक का उपयोग नहीं करता हूं तो कोड सही डेटा आउटपुट करेगा लेकिन फिर लापता दिखाई देगा क्योंकि आईनेमेरेबल काम करना जारी रखता है। मैं यह लिख सकते हैं कैसे इतना है कि मैं सिर्फ इस तरह इसका इस्तेमाल कर सकते हैं:

foreach (int i in Fibonacci().Where(n => n >= 24 && n <= 56)) 
{ 
    Console.WriteLine(i); 
} 

उत्तर

12

आपको इसके बजाय SkipWhile और TakeWhile के संयोजन का उपयोग करने की आवश्यकता है।

foreach (int i in Fibonacci().SkipWhile(n => n < 24) 
          .TakeWhile(n => n <= 56)) 
{ 
    Console.WriteLine(i); 
} 

ये किसी शर्त के आधार पर लूप समाप्त करने में सक्षम हैं; Where इनपुट इनपुट (आपके मामले में, कभी नहीं) तक इनपुट (फ़िल्टरिंग उचित) स्ट्रीम करता है।

+0

मैंने अभी यह पता लगाया था और इसे स्वयं पोस्ट करने वाला था। अजीब बात यह है कि आखिरकार प्रश्न को लिखने से आपको कभी-कभी –

+0

हम्म पर इंगित किया जाता है ... मेरी मूल समस्या यह है कि मुझे इसे केवल एक लैम्ब्डा अभिव्यक्ति में करने पर ठीक किया गया था। अब मैं एक नया "SkipThenTakeWhile()" Inumerable एक्सटेंशन लिखने का लुत्फ उठा रहा हूं जो इसे अनुमति देगा, अगर केवल मैं इसके लिए बेहतर नाम सोच सकता हूं;) –

+0

जबकि मुझे LINQ ऑपरेटरों को भी लिखने का आनंद मिलता है, तो मैं सवाल करता हूं कि यह वास्तव में एक योग्यता के लिए वास्तव में पर्याप्त आता है;) –

-2

मुझे नहीं लगता कि यह संभव है, जब तक कि आप अपने खुद के LINQ प्रदाता लिख ​​सकता हूँ। उदाहरण में आपने दिया है कि आप LINQ से ऑब्जेक्ट्स का उपयोग कर रहे हैं जिन्हें इसे फ़िल्टर लागू करने से पहले IENumerable का पूर्ण मूल्यांकन करने की आवश्यकता होगी।

+4

शुक्र है कि आईनेमेरेबल वास्तव में इस तरह काम नहीं करता है: यह फ़िल्टर को लागू करता है क्योंकि यह मूल्यांकन करता है ताकि डेटा दोहराए जाने के बजाय स्ट्रीम किया जा सके। –

+0

जोएल आप सही हैं, मैं कार्यात्मक प्रोग्रामिंग के अपने मूल प्रधानाचार्यों को भूल गया जहां एक ऑपरेशन का साइड इफेक्ट नहीं हो सकता है। –

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