Je cette IEnumerable LINQ requête suivante:briser une requête <int> IEnumerable qui utilise Enumerable.Range
var query = from p in Enumerable.Range(2, 1000000)
let sumofPowers = from ch in p.ToString()
let sumOfPowers = Math.Pow(Convert.ToDouble(ch.ToString()), 5)
select sumOfPowers
where p == sumofPowers.Sum()
select p;
Il trouve la somme de tous les nombres qui peut être écrit comme la somme des puissances cinquième de leurs chiffres. C'est le projet Euler Problem 30
Cela fonctionne très bien comme il est. Je sais que c'est nitpick, mais la gamme m'ennuie. J'ai essentiellement deviné qu'il a trouvé le bon résultat à 1 000 000, alors je l'ai laissé s'arrêter là. Dans ce scénario, le nombre était suffisant.
Mais c'est juste un nombre "aléatoire" codé en dur. Si vous regardez le code, vous trouvez que dès que p == sumofPowers.Sum()
est vrai, vous n'avez plus vraiment besoin de parcourir la boucle.
Je sais que yield
peut le faire dans d'autres situations et break
fonctionne dans les boucles normales - donc y a-t-il quelque chose que vous pouvez faire dans cette situation?
Je ne suis pas sûr de ce que vous voulez dire par la dernière partie. Math.pow (Convert.ToDouble (ch.ToString()), 5) ne fonctionnera pas car Math.pow ((double) ch, 5) – CasperT
Essayez: de ch en p laisser sumOfPowers = Math.pow (Convert.ToDouble (ch), 5) –