Mi código a continuación encuentra todos los números primos por debajo de number
creando una lista de números primos y verificando si el primer potencial potencial es divisible uniformemente por cualquier número primo en la lista.¿Se puede acceder a IEnumerable a medida que se devuelve?
Estoy tratando de aprender los pormenores de yield return
. En este momento tengo un List<int> primes
que uso dentro de la función. Pero devuelvo los mismos datos a través del yield return
. Entonces mi pregunta es
¿Puedo acceder al IEnumerable < int> desde el interior de la función tal como la estoy creando? Así que puedo eliminar la lista < int> primes por completo.
/// <summary>
/// Finds all primes below <paramref name="number"/>
/// </summary>
/// <param name="number">The number to stop at</param>
/// <returns>All primes below <paramref name="number"/></returns>
private static IEnumerable<long> PrimeNumbers(long number)
{
yield return 2;
List<long> primes = new List<long>(2);
for(long num = 3; num < number; num += 2)
{
//if any prime lower then num divides evenly into num, it isn't a prime
//what I'm doing now
if(!primes.TakeWhile(x => x < num).Any(x => num % x == 0))
{
primes.Add(num);
yield return num;
}
//made-up syntax for what I'd like to do
if(!this.IEnumerable<long>
.TakeWhile(x => x < num).Any(x => num % x == 0))
{
yield return num;
}
}
}
Respuesta corta: No. Respuesta larga: hay mejores formas de obtener números primos hasta cierto número. Echa un vistazo a Sieve of Sundaram: http://en.wikipedia.org/wiki/Sieve_of_Sundaram – SimpleVar
También puedes mejorar yendo por Sieve of Eratosthenes: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes y aún más yendo por Sieve of Atkin: http://en.wikipedia.org/wiki/Sieve_of_Atkin Creo que es una de las formas más rápidas conocidas hoy en día para generar números primos (si no el más rápido) y también hay un pseudo código en wiki para ayudarte a obtener empezado. – SimpleVar
@YoryeNathan Vi esos tamices en la wikipedia y si fuera a mantener este código en algún lugar importante, probablemente los usaría. Este código fue más para ayudar a entrenarme a mí mismo sobre cómo pensar en la mentalidad de "retorno de rendimiento". –