2014-12-02 3 views
5

मेरे पास डेटा का एक अनुक्रम है जिसे मुझे फ़िल्टर करने की आवश्यकता है। यह काफी स्पष्ट है क्योंकि हमारे पास Seq.filter मान है। लेकिन, मेरी समस्या यह है कि मुझे फ़िल्टर करने की आवश्यकता है जब तक कि परिणामस्वरूप संग्रह कुछ निश्चित वस्तुओं तक नहीं पहुंच जाएगा। मैं सभी वस्तुओं पर फ़िल्टरिंग नहीं करना चाहता हूं और छंटनी करने के बजाय, मैं उस समय फ़िल्टरिंग को रोकना चाहता हूं जब मुझे इसकी आवश्यकता नहीं होती है।एफ # अनुक्रम फ़िल्टर एक कार्यात्मक शैली में

मूल रूप से यह अनिवार्य प्रोग्रामिंग में एक बहुत ही आसान काम है - मैं इसे आसानी से एफ # में कर सकता हूं जैसे यह सी # में किया जाएगा, लेकिन मैं इसे कार्यात्मक शैली में करना चाहता हूं।

मैंने Collections.Seq मॉड्यूल पर एक नज़र डाली है लेकिन मुझे कुछ भी नहीं मिला है जो मेरी मदद करेगा। वास्तव में मुझे filterWhile जैसे कुछ की आवश्यकता होगी। कोई विचार?

सहायता के लिए धन्यवाद।

उत्तर

9

तुम बस Seq.filter परिणाम आप प्राप्त करने के लिए रुचि रखते हैं की संख्या के साथ एक Seq.take के बाद का उपयोग करें:

Seq.filter और Seq.take, आलसी हैं तो जब seq यह छानने बंद हो जाएगा मजबूर किया जाता है एक बार परिणाम इच्छित आकार तक पहुँच जाता है ।

यहाँ एक उदाहरण है, अगर यह वास्तव में छानने बंद हो जाता है परीक्षण करने के लिए एक अनंत अनुक्रम का उपयोग:

Seq.initInfinite id 
    |> Seq.filter (fun x -> x % 2 = 0) 
    |> Seq.take 10 
    // then if you force the Seq 
    |> Seq.toArray 

और यह एक कार्यात्मक शैली है, इस तरह से आप एफपी भाषाओं में समस्या का समाधान एक आलसी संग्रह का उपयोग करके है , उदाहरण के लिए हास्केल में जो एक शुद्ध एफपी भाषा है, आप सूचियों के साथ ऐसा ही करते हैं: take 10 (filter (\x -> mod x 2 == 0) [0..])

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