Contexto: C# 3.0, .Net 3.5
Supongamos que tengo un método que genera números aleatorios (siempre):Obtener próximos N elementos de enumerable
private static IEnumerable<int> RandomNumberGenerator() {
while (true) yield return GenerateRandomNumber(0, 100);
}
necesito grupo esos números en grupos de 10, entonces me gustaría algo como:
foreach (IEnumerable<int> group in RandomNumberGenerator().Slice(10)) {
Assert.That(group.Count() == 10);
}
He definido el método Slice, pero creo que debería haber uno ya definido. Aquí es mi método de la rebanada, apenas para la referencia:
private static IEnumerable<T[]> Slice<T>(IEnumerable<T> enumerable, int size) {
var result = new List<T>(size);
foreach (var item in enumerable) {
result.Add(item);
if (result.Count == size) {
yield return result.ToArray();
result.Clear();
}
}
}
Pregunta: hay una manera más fácil de lograr lo que estoy tratando de hacer? Quizás Linq?
Nota: el ejemplo anterior es una simplificación, en mi programa tengo un iterador que escanea la matriz dada de forma no lineal.
EDITAR: Por qué Skip
+ Take
no es bueno.
eficacia lo que quiero es:
var group1 = RandomNumberGenerator().Skip(0).Take(10);
var group2 = RandomNumberGenerator().Skip(10).Take(10);
var group3 = RandomNumberGenerator().Skip(20).Take(10);
var group4 = RandomNumberGenerator().Skip(30).Take(10);
sin la sobrecarga de la regeneración de número (10 + 20 + 30 + 40) veces. Necesito una solución que generará exactamente 40 números y los dividirá en 4 grupos por 10.
¿Por qué quiere enumerarlo? Simplemente pase la cantidad de números aleatorios que desea generar y luego devuelva una colección de números aleatorios. – epitka
¿Estoy en lo cierto al decir que el código 'RandomNumberGenerator' que publicó no es el código real que está usando? Porque me parece que solo debería devolver un valor único, en lugar de enumerarlo para siempre (para eso necesitaría usar una construcción de bucle). –
@ user93422, ¿no sería más fácil crear una clase de contexto de generador y proporcionar un 'GetNext()' y 'GetNext (int count)' en lugar de intentar dividir una enumeración infinita? Este es el diseño que usa la clase Random y es una manera limpia de lograr lo que busca. –