5

कभी-कभी मुझे लगता है कि मुझे अंतिम आइटम को छोड़कर प्रत्येक आइटम के बाद एक नया आइटम डालने से एक सूची को संसाधित करने की आवश्यकता है। स्ट्रिंग्स की सूची के प्रत्येक आइटम के बीच आप एक अल्पविराम कैसे डाल सकते हैं।कार्यात्मक सूची में हेरफेर में, हम "प्रत्येक आइटम के बीच कुछ डालने" को क्या कहते हैं?

मैं पिछले (या पहले) आइटम हर बार के लिए विशेष मामला कोडिंग से तंग आ गया, तो मैं एक Linq शैली विस्तार में पैटर्न पर कब्जा कर लिया:

public static IEnumerable<T> Separate<T>(this IEnumerable<T> source, 
             Func<T> separator) 
{ 
    bool first = true; 
    foreach (T item in source) 
    { 
     if (first) 
      first = false; 
     else 
      yield return separator(); 

     yield return item; 
    } 
} 

उदाहरण के लिए, यह मेरे लिए अनुमति देता है आसानी से प्रोग्राम के हाइपरलिंक के साथ एक प्रवाह दस्तावेज़ को भरने, लेकिन हर एक के बीच एक रेखा ब्रेक के साथ:

para.Inlines.AddRange(_recentFiles.Select(f => f.ToHyperlink()) 
            .Separate(() => new LineBreak())); 

मान लिया जाये कि यह पहले से ही नहीं है System.Linq.Enumerable में मौजूद हैं (जो मैं आमतौर पर कुछ लिख के तुरंत बाद की खोज क्या है इस तरह), सवाल यह है कि यहक्या है सूचियों परऑपरेशन आमतौर पर अन्य कार्यात्मक ढांचे या भाषाओं में बुलाया जाता है? अन्य :-)

उत्तर

14

हास्केल: intersperse

Zip आम तौर पर एक अलग आपरेशन (zip [a, b, c] [x, y, z] = [(a, x), (b, y), (c, z)])

+1

दिलचस्प - यह मेरा अनुमान था, साथ ही साथ एक अच्छा नाम भी था, लेकिन मुझे नहीं पता था कि यह पहले से ही हास्केल में उपयोग किया गया था :) –

+2

हास्केल और अनुमोदन की एक स्कीट मुहर, यह वास्तव में सोने का मानक क्यों है! –

+0

हां, हास्केल के अच्छे फ़ंक्शन नामों में से एक (केवल mapM_ आदि ;-) के बारे में सोच रहा है) – Dario

0

ऊपर एक ज़िपर (ज़िप ब्रिटिश) कर की तरह लगता है।

+0

ज़िप एक अलग ऑपरेशन है, हालांकि दो अनुक्रमों को टुपल्स के नए अनुक्रम में परिवर्तित करना है। –

2

यह अक्सर कहा जाता है में शामिल होने पर लंबे पक्ष और विभाजक पर, डेटा के साथ -

+0

'जॉइन' का अर्थ 'स्ट्रिंग' पर समान अर्थ है, लेकिन बीसीएल में 'आईनेमेरेबल' पर पहले से ही बहुत अलग अर्थ है। –

+0

+1 जुड़ें उपयोगकर्ताओं को भी परेशान करने के लिए परिचित होंगे, यह कार्यात्मक उपयोगकर्ताओं से थोड़ा परिचित है, थोड़ा दुर्भाग्यपूर्ण है। मुझे अंतरंग नाम सबसे अधिक पसंद है लेकिन यह एक योग्य विचार – ShuggyCoUk

+0

है हालांकि यह आमतौर पर एक स्ट्रिंग-विशिष्ट ऑपरेशन होता है, फिर भी पाइथन, रूबी और शायद कुछ अन्य भाषाओं में एक स्ट्रिंग.जॉइन भी है, इसलिए यह निश्चित रूप से खराब नाम नहीं है इस तरह के ऑपरेशन के लिए। – MatrixFrog

1

यह थोड़ा string.Join() की तरह लग रहा है इसका मतलब है, हालांकि जुड़ें कोई वास्तविक सूची वापस नहीं करता है।

1

इसे क्लोजर में भी हस्तक्षेप कहा जाता है।

user> (interpose "," ["a" "b" "c"]) 
("a" "," "b" "," "c")