8
votes

Rx: énumérableex.for () vs énumérable.selectmany ()

system.interactive.dll comprend une méthode pour () code> avec la mise en œuvre suivante:

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


0 commentaires

3 Réponses :


0
votes

Ils ressemblent à une fonctionnalité équivalente pour moi. SelectMany est une méthode d'extension sur un iNeumable et .Pour est écrit comme une méthode statique sur l'énumérable. Ils sont donc appelés différemment. xxx

Je suis sûr qu'il existe des raisons spécifiques d'utiliser chacun.


0 commentaires

2
votes

bonne question. Ils produisent les mêmes résultats, mais les implémentations internes sont assez différentes.

Enuméreurex.Pour aurait été ajouté au système.interactive pour maintenir la dualité entre iobservable et ienumerables. Notez que Observable.Pour et observable.SelectMany sont différents: P>

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


1 commentaires

0
votes

Je suppose que SeltMany traverse tout de manière dynamique, alors que Concat (pour) traverse tous ses éléments iénumérables externes avant de commencer à s'inscrire et à les itérair.

En d'autres termes, Concat fonctionne avec un ensemble fixe d'iEnumérable, même s'il les reçoit comme un iNeumable. Par conséquent, dans l'ensemble de l'ensemble d'iEnumérables est créé avant même de retourner la première tresulte. Dans SelectMany, vous recevez une treesulte instantanément.


2 commentaires

Étant donné que tous les opérateurs impliqués (SelectMany, Select et Concat) sont différés, je ne suis pas sûr que toute différence de mise en œuvre se traduirait par un comportement d'extrémité différent. Certains tests avec des effets secondaires à différents points de chaque sélecteur de chaque opérateur semblent toujours donner le même résultat différé.


Dans Concat, vous savez déjà combien vous avez besoin de travailler avec SelectMany, son montant dépend du montant de l'entretien de la source. Pour des sources d'entrée de taille constante, les deux devraient produire la même chose