11
votes

Quand "rendement" est-il vraiment nécessaire?

Duplicaté possible:

C # - Utilisation correcte du rendement de rendement

Qu'est-ce qui peut être un cas d'utilisation réel pour le rendement C #?

merci.


1 commentaires

Justin Etheredge l'explique vraiment bien dans la série Tekpub Mastering Linq. Tekpub.com/preview/LINQ


4 Réponses :


25
votes

Lorsque vous voulez Exécution différée .

Cela a du sens Dans la plupart des cas où l'alternative consiste à construire une collection temporaire.

Considérez ce scénario: j'ai une liste d'entiers et je souhaite énumérer leurs carrés.

Je pourrais faire ceci: xxx

puis je pourrais résumer les carrés, prendre leur moyenne, trouver le plus grand, etc.

mais je n'ai vraiment pas besoin de peupler un tout Nouvelle liste à cette fin. J'aurais pu utiliser produire pour énumérer sur la liste initiale et renvoyer les carrés un-par-un: xxx

le fait que cela fait réellement Une différence peut ne pas être apparente avant de commencer à traiter avec de très grandes collections, où peupler des collections temporaires s'avère assez gaspillée.

Par exemple supposez que je voulais trouver le premier carré au-dessus d'un certain seuil. Je pourrais faire cela: xxx

mais si mes carrés ont rempli une liste de complète avant de retourner, le Le code ci-dessus ferait potentiellement beaucoup plus de travail que nécessaire.


1 commentaires

Exemple bien écrit. + 1 pour pourquoi la différence pourrait ne pas être apparente.



10
votes

du page MSDN sur rendement :

Utilisé dans un bloc d'itérateur pour fournir une valeur à l'objet de l'énumérateur ou pour signaler la fin de l'itération.

Vous l'utilisez lors de la création d'un itérateur personnalisé. Utilisation de l'exemple de la page: xxx

le rendement signifie que le tandis que boucle à l'intérieur POWER efficacement "pause" après chaque itération pour permettre à la routine d'appel d'effectuer une action. Dans ce cas, imprimez le résultat.


0 commentaires

8
votes

Lorsque vous êtes trop paresseux pour écrire votre propre ienumerator ;)


8 commentaires

+1 Je pense que je suis toujours trop paresseux ...


Et il convient probablement de noter qu'il y a une différence entre ienumerator et iénumérable, les mots sont épelés assez de la même manière que j'avais l'habitude d'être confus parce que je lisais des définitions différentes pour ce que je pensais être la même chose


@ Davy8 très vrai! Beaucoup de gens sont confondus par la différence. L'ienumerator contient tout le rendement caché de la logique. L'iEnumerable fournirait simplement un accès à l'ienumerator.


L'ienumerator peut-il remplacer la fonctionnalité de rendement?


@Newb Ecrire vos propres classes iénumérables et Ienumerator est le moyen "manuel" de créer votre propre logique d'énumération complexe, comme une exécution différée, des projections, un filtrage, etc. Le compilateur nous donne simplement un "raccourci" rapide en utilisant le rendement. Ce n'est pas aussi puissant, mais juste un mot clé au lieu d'une classe entière, donc pour des cas simples, il est plus rapide et plus facile.


Voulez-vous dire que Yiels est une implémentation de compilateur d'interfaces Ienumer * dans les coulisses? Ou que les deux sont traduits de la même manière par le compilateur? En outre, voir la réponse de Dan Tao ci-dessous - il utilise le rendement en plus de iEnumerable.


@Newb et c'est ce que je veux dire par la confusion entre ienumerator et iénumérable. Une iénumérable est ce que les gens travaillent habituellement, c'est une collection de commandes de valeur pouvant potentiellement être infinie de longueur en utilisant un ienumerator. L'ienumerator est ce qui indique à un look pour obtenir la valeur suivante dans l'Ineumable spécifié


@Newb Dan Tao La réponse renvoie un iéenérable, il n'a pas écrit sa propre classe iénumérable. C'est la différence - vous pouvez retourner un iNeumable avec un rendement ou écrire votre propre classe iEnumerable et retourner cela.