Étant donné un numéro de départ, imaginez une séquence infinie de ses moitiés successifs. (ignorez les instabilités numériques inhérentes à double code>.) p> < p> Peut-on être fait dans une seule expression sans écrire des méthodes d'extension personnalisées ou des méthodes génératrices? p> p>
5 Réponses :
Je ne connais pas une seule expression, mais j'ai trouvé ce code générateur intelligent ici: http://csharpintepth.com/articles/Chapter11/streaminganditéLAiterators.aspx Dans votre cas, vous l'utiliseriez: P> foreach (double d in Generate<double>(1, c => c / 2))
{
...
}
Enumerable.Repeat(1, int.MaxValue).Select((x, i) => x / Math.Pow(2, i)) It isn't actually infinite, but as both Repeat and Select use deferred execution, you won't lose any performance.Don't know any native way to create infinite linq expression.Or you can manually write infinite version of .Repeat
Pour le plaisir, voici un truc pour créer une véritable séquence infinie dans une seule expression. Les deux premières définitions sont des champs de classe, de sorte qu'ils ne nécessitent pas d'expression à être initialisés.
double? helper; IEnumerable<double> infinite; infinite = new object[] { null }.SelectMany(dummy => new double[] { (helper = (helper / 2) ?? 1).Value }.Concat(infinite));
C'est génial, de manière terrible :)
Je n'avais pas voulu cela comme autre chose :)
Cool. Vous pouvez énumérer cela à Linqpad, mais pour une raison quelconque, il se bloque si vous essayez de faire un compte () dessus; o)
@HVD Jetez un coup d'œil à ma réponse pour une autre solution amusante, c'est très basé sur la vôtre, mais en utilisant l'opérateur y code>.
Je ne connais aucun moyen de faire une séquence infinie avec linq droit. Mais vous pouvez faire une séquence très longue em> em> Cependant, puisque double code> a une précision finie, vous n'obtiendrez que des zéros après
n code> devient trop élevé. p> p>
Voici une réponse similaire à celle fournie par @HVD, mais à l'aide de l'opérateur un exemple d'utilisation serait : p> qui produirait 20, 10, 5, 2,5 ... p> Je ne conseillerais pas en utilisant ceci dans le code de production mais c'est amusement. p> L'opérateur Y code> défini ici , cela supprime la nécessité pour les variables locales:
y code> permet également d'autres expressions lumbda récursives, par exemple: p>
C'est soigné. Il utilise deux expressions, mais il est juste possible que la fonction y code> soit déjà définie quelque part, auquel cas vous pourriez y réfléchir et éviter sa définition.
Pourquoi la restriction arbitraire? Est-ce que ce devoir? Si vous n'êtes pas engagé dans vos limitations exprimées, écrivez simplement un itérateur à l'aide d'un rendement
code>
retour code>.
Les séquences infinies et les ordinateurs ne fonctionnent pas ensemble.
@Ramhound Bien sûr qu'ils le font, tant que vous n'essayez pas d'obtenir tous les articles.
Connexes: Stackoverflow.com/questions/5443939
@hvd: J'adore ça! "Vous pouvez essayer, Dr. Turing ..."
Il n'y a pas de méthode fournie à la séquence-standard-Séquence qui renvoie toute séquence infinie i>, et vous ne pouvez pas obtenir de sang d'une pierre; Sans une séquence infinie pour commencer, vous n'allez pas obtenir une séquence infinie à l'arrière de tout opérateur de séquence. Maintenant, si tout ce que vous voulez, c'est une séquence vraiment gros i>, dites, avec un milliard d'articles dedans, c'est sûr que ce n'est pas un problème du tout. Prenez enumérable.Range aussi grande que vous le souhaitez et sélectionnez
i => x / math.pow (2, i) code> pour n'importe quel X est votre élément de départ.
Les instabilités en double application lorsqu'elles représentent une fraction dont le dénominateur n'est pas une puissance de deux ou une fraction dont le dénominateur est une puissance de deux mais dont le numéro de député nécessite plus de 53 bits. Le cas échéant ici, vous obtiendrez donc des représentations exactes de toutes les valeurs jusqu'à ce que vous atteigniez DOUBLE.EPSILON; Ensuite, toutes les valeurs suivantes seront nulles.
@RoberTharvey, j'étais juste curieux de voir s'il était possible et espérant apprendre quelque chose de nouveau - ça fait longtemps que j'avais des devoirs :) comme Eric Lippert i> souligne, il n'y a pas de -Les fonctions de génération de séquence infinie, alors peut-être qu'il y a une sorte d'astuce qui va ceci.
@Phoog, je ne le savais pas. Très frais d'informations supplémentaires sur cette question cependant, merci.
@ Drewnoakes Oui, j'ai supposé que la valeur de départ était
1 code>, comme dans l'exemple. Une représentation inexacte d'une autre fraction, telle que
1d / 3 code>, conservera la même imprécision (pourcentage-sage) chaque fois que vous gasdiez la valeur (car vous traitez avec une puissance de 2). Division par 2 signifie décrémenter les bits représentant l'exposant; Les bits représentant le "signification" sont inchangés. Lorsque vous arrivez à des valeurs dénormalisées, la division par deux est un changement de bit droit, et vous risquez de perdre la précision. en.wikipedia.org/wiki/double-precision_floating-point_format si vous " re intéressé par les détails.