سؤال

System.Interactive.dll يشمل أ For() الطريقة مع التنفيذ التالي:

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)
هل كانت مفيدة؟

المحلول

سؤال جيد. أنها تنتج نفس النتائج ولكن التطبيقات الداخلية مختلفة تماما.

تم إضافة EnumerableEx.for إلى النظام. لاحظ أن الملاحظة. للملاحظة.

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)

لذلك تتوقع أن يكون لهذا التوقيع ، بدلاً من ذلك الذي يمتلكه بالفعل:

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

ومع ذلك ، من الواضح أنه لا يأخذ مصدرًا قابلاً للرسو. ربما كان من المفترض أن. أود أن أطرح سؤالك في منتديات RX ، لمعرفة ما إذا كان لدى فريق RX إجابة.

نصائح أخرى

تبدو مثل الوظائف المكافئة بالنسبة لي. Selectany هي طريقة تمديد على iEnumerable و. كما هو مكتوب كطريقة ثابتة على EnumerableEx ، لذلك يطلق عليها بشكل مختلف.

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

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

أنا متأكد من أن هناك أسباب محددة لاستخدام كل واحد.

أظن أن Selectany يعبر كل شيء بشكل ديناميكي ، في حين أن Concat (في) يعبر جميع عناصرها الخارجي غير المصابية قبل البدء في التسجيل والتكرار عليها.

وبعبارة أخرى ، يعمل Concat مع مجموعة ثابتة من ienumerable حتى لو استقبلها على أنها غير قابلة للتطبيق. لذلك ، في ، يتم إنشاء مجموعة كاملة من iEnumerable قبل إرجاع tresult الأول. في Selectany ، تتلقى tresult على الفور.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top