2009-03-30 6 views
6

मैं वर्तमान में कुछ परियोजना यूलर समस्याओं को कर रहा हूं और पहले के लोगों में अक्सर फिबोनाची संख्या या प्राइम्स जैसी चीज़ें शामिल होती हैं। उन पर इटरेटिंग LINQ के लिए एक प्राकृतिक फिट प्रतीत होता है, कम से कम पठनीयता में और कोड के "लालित्य" को माना जाता है (मैं भाषा-विशिष्ट विशेषताओं का उपयोग करने की कोशिश कर रहा हूं जहां संभव हो और भाषाओं के लिए एक महसूस करने के लिए लागू हो)।संभावित रूप से अनंत सूचियों पर LINQ प्रश्न

मेरी समस्या अब है, अगर मुझे केवल एक निश्चित सीमा तक संख्याओं का एक सेट चाहिए, तो मुझे इसे सबसे अच्छा कैसे व्यक्त करना चाहिए? वर्तमान में मैंने इटरेटर में संबंधित सीमा को कड़ी-कोडित किया है, लेकिन मैं वास्तव में सूची को वापस लौटने के लिए पसंद करूंगा जब तक कि बाहर कुछ ऐसा नहीं पूछता है, क्योंकि यह एक निश्चित सीमा से अधिक है। तो मूल रूप से मेरे पास एक संभावित अनंत इटेटरेटर है लेकिन मैं केवल इससे संख्याओं का एक सीमित सेट लेता हूं। मुझे पता है कि ऐसी चीजें कार्यात्मक भाषाओं में तुच्छ हैं, लेकिन मुझे आश्चर्य है कि सी # इसके लिए भी अनुमति देता है या नहीं। मेरे पास एकमात्र अन्य विचार था जो एक इटेटरेटर प्राइम्स (लंबा) होगा जो कि एक निश्चित सीमा तक प्राइम देता है, इसी तरह अन्य अनुक्रमों के लिए।

कोई विचार?

उत्तर

10

अधिकांश LINQ विधियों (संख्यात्मक वर्ग) आलसी हैं। तो उदाहरण के लिए, वहाँ के साथ कुछ भी गलत नहीं:

var squares = Enumerable.Range(0, Int32.MaxValue).Select(x=>x*x); 

आप परिणामों को सीमित करने के लिए ले विधि का उपयोग कर सकते हैं:

var 10squares = squares.Take(10); 

var smallSquares = squares.TakeWhile(x => x < 10000); 

संपादित करें: बातें आप से बचने की जरूरत हैं कार्यों कि लौटने "lazily "लेकिन परिणाम देने के लिए पूरे गणित का उपभोग करना होगा। उदाहरण के लिए, समूहीकृत या छँटाई:

var oddsAndEvens = Enumerable.Range(0, Int32.MaxValue) 
          .GroupBy(x => x % 2 == 0); 
foreach (var item in oddsAndEvens) { 
    Console.WriteLine(item.Key); 
} 

(यही कारण है कि शायद आप 32-बिट पर एक OutOfMemoryExeption दे देंगे।)

+0

आह, ठीक है, नहीं TakeWhile अब तक पता नहीं था। मैंने सोचा कि उपयोग करने वाले नंबरों का चयन करने के लिए मैं काम नहीं करना चाहूंगा क्योंकि LINQ को पता नहीं है कि संख्याएं बढ़ रही हैं, उदाहरण के लिए। यह अच्छा लगता है, वास्तव में :) – Joey

+0

+1, अच्छा सारांश। मैंने इस विषय पर थोड़ा विस्तार करने की भी कोशिश की: http://blog.casualdev.net/2009/10/linq-and-infinite-enumerations.html –

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