Rx: EnumerableX.for () vs enumerable.selectmany ()
-
28-09-2019 - |
سؤال
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 على الفور.