2010-10-06 12 views
7

System.Interactive.dll निम्नलिखित कार्यान्वयन के साथ एक For() विधि में शामिल हैं: कुछआरएक्स: EnumerableEx.For() बनाम Enumerable.SelectMany()

IEnumerable<TResult> For<TSource, TResult>(
    IEnumerable<TSource> source, 
    Func<TSource, IEnumerable<TResult>> resultSelector) 
{ 
    return source.Select<TSource, IEnumerable<TResult>>(resultSelector).Concat<TResult>(); 
} 

मुझे याद आ रही है या मौजूदा Enumerable.SelectMany() को यह बराबर है, शून्य this?

IEnumerable<TResult> SelectMany<TSource, TResult>(
    this IEnumerable<TSource> source, 
    Func<TSource, IEnumerable<TResult>> selector) 

उत्तर

1

अच्छा सवाल। वे एक ही परिणाम उत्पन्न करते हैं लेकिन आंतरिक कार्यान्वयन काफी अलग हैं।

EnumerableEx.For को सिस्टम में जोड़ा गया होगा। IOervervable और IENumerables के बीच द्वंद्व को बनाए रखने के लिए इंटरैक्टिव। ध्यान दें कि Observable.For और Observable.SelectMany अलग हैं:

IObservable<TResult> For<TSource, TResult>(IEnumerable<TSource> source, Func<TSource, IObservable<TResult>> resultSelector) 

बनाम,

IObservable<TResult> SelectMany<TSource, TResult>(this IObservable<TSource> source, Func<TSource, IObservable<TResult>> selector) 

इसलिए आप उम्मीद थी कि EnumerableEx.For इस हस्ताक्षर यह वास्तव में है एक की बजाए होगा, :

IEnumerable<TResult> For<TSource, TResult>(**IObservable**<TSource> source, Func<TSource, IEnumerable<TResult>> resultSelector) 

हालांकि, यह स्पष्ट रूप से एक IObservable स्रोत नहीं लेता है। शायद इसका मतलब था। मैं आरएक्स टीम के पास जवाब देने के लिए आरएक्स मंचों में अपने प्रश्न पूछूंगा।

+0

आरएक्स मंचों पर पूछे गए: http://social.msdn.microsoft.com/Forums/en-US/rx/thread/48992ccb-d2dc-4de4-8525-d88ce8622554 – dahlbyk

+0

आरएक्स मंच पर बार्ट डी स्मेट द्वारा पुष्टि । – dahlbyk

0

वे मेरे समकक्ष कार्यक्षमता की तरह दिखते हैं। SelectMany एक IENumerable पर एक विस्तार विधि है और इसके लिए EnumerableEx पर एक स्थिर विधि के रूप में लिखा गया है, इसलिए उन्हें अलग-अलग कहा जाता है।

foreach(var s in list.SelectMany(Filter)) 
    { 
     // ... 
    } 

    foreach (var s in EnumerableEx.For(list, Filter)) 
    { 
     // ... 
    } 

मुझे यकीन है कि प्रत्येक का उपयोग करने के विशिष्ट कारण हैं।

0

मेरा अनुमान है कि SelectMany गतिशील रूप से सब कुछ ट्रैवर्स करता है, जबकि Concat (के लिए) उनके साथ पंजीकरण करने से पहले अपने सभी बाहरी ज्ञानहीन तत्वों को पार करता है और उन पर फिर से शुरू होता है।

दूसरे शब्दों में, Concat IENumerable के एक निश्चित सेट के साथ काम करता है भले ही यह उन्हें एक आईनेमरेबल के रूप में प्राप्त करता हो। इसलिए, के लिए, IENumerable का पूरा सेट पहले TResult को वापस करने से पहले बनाया गया है। SelectMany में, आपको तुरन्त एक ट्रेशल्ट प्राप्त होता है।

+0

चूंकि सभी ऑपरेटरों को शामिल किया गया है (SelectMany, Select and Concat) स्थगित हैं, मुझे यकीन नहीं है कि कार्यान्वयन में कोई अंतर एक अलग अंत व्यवहार में अनुवाद करेगा। प्रत्येक ऑपरेटर के चयनकर्ता में विभिन्न बिंदुओं पर साइड इफेक्ट्स के साथ कुछ परीक्षण हमेशा एक ही स्थगित परिणाम उत्पन्न करते हैं। – dahlbyk

+0

कंसल्ट में, आप पहले से ही जानते हैं कि आपको कितने आईनेमेरेबल के साथ काम करने की ज़रूरत है, जबकि SelectMany में, इसकी राशि इस बात पर निर्भर करती है कि स्रोत से कितने तत्व आते हैं। निरंतर आकार के इनपुट स्रोतों के लिए, दोनों को इसका उत्पादन करना चाहिए – akarnokd

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