8

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)
4

3 に答える 3

2

良い質問。それらは同じ結果を生成しますが、内部実装はまったく異なります。

EnumerableEx.ForがSystem.Interactiveに追加され、IObservableと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ソースを使用しません。おそらくそれは意図されていたのでしょう。Rxフォーラムで質問して、Rxチームに回答があるかどうかを確認します。

于 2010-10-06T21:34:33.933 に答える
0

それらは私には同等の機能のように見えます。SelectManyはIEnumerableの拡張メソッドであり、.ForはEnumerableExの静的メソッドとして記述されているため、呼び出し方が異なります。

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

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

それぞれを使用する特定の理由があると確信しています。

于 2010-10-06T17:45:24.357 に答える
0

私の推測では、SelectManyはすべてを動的にトラバースしますが、Concat(For内)は、登録を開始してそれらを反復処理する前に、外側のIEnumerable要素をすべてトラバースします。

つまり、Concatは、IEnumerableとして受け取った場合でも、IEnumerableの固定セットを処理します。したがって、Forでは、最初のTResultを返す前に、IEnumerableのセット全体が作成されます。SelectManyでは、TResultを即座に受け取ります。

于 2011-02-05T15:27:29.400 に答える