2010-11-10 20 views
10

Si Start=0 y Count=10 entonces cómo obtener los valores alternativos usando Enumerable.Range() la opción de venta a cabo debe ser como { 0, 2, 4, 6, 8 }¿Cómo obtener números alternativos usando Enumerable.Range?

y si Start=1 y Count=10 continuación { 1, 3, 5, 7, 9 }

El valor continuo se puede obtener como

var a = Enumerable.Range(0,10).ToList(); 

pero cómo obtener los valores alternativos?

+0

¿Qué pasa con 'for' loop? –

+1

@ Thomas Anderson: Usando 'for' loop podemos hacer esto. ¿Pero podemos hacer esto usando 'LINQ'? –

+3

@Thomas: La gente comenzó a odiar el bucle 'for' /' foreach' una vez que usaron LINQ. LINQ es la moda, mientras que 'for' es antiguo. Entonces intentan usar LINQ incluso 'for' es mucho más adecuado. –

Respuesta

0

¿Qué que son después de que aquí no existe en el BCL por lo que yo sepa, así que hay que craete su propia clase estática como este para lograr la funcionalidad requerida:

public static class MyEnumerable { 
    public static IEnumerable<int> AlternateRange(int start, int count) { 
    for (int i = start; i < start + count; i += 2) { 
     yield return i; 
    } 
    } 
} 

continuación, puede utilizar como este donde quiera que quiere:

foreach (int i in MyEnumerable.AlternateRange(0, 10)) { 
    //your logic here 
} 

A continuación, puede también realizar LINQ consulta utiliza este ya que devuelve IEnumerable

lo tanto, si se desea se puede aleo escribir lo anterior como esto si desea excluir la número 6

foreach (int i in MyEnumerable.AlternateRange(0, 10).Where(j => j != 6)) { 
    //your logic here 
} 

Espero que esto es lo que está buscando.

No puede tener esto como un método de extensión en Enumerable directamente ya que es una clase estática, y los métodos de extensión funcionan en un objeto de una clase, y no en la clase misma. Es por eso que debe crear una nueva clase estática para mantener este método si desea imitar la clase Enumerable.

+0

+1 buena solución –

+0

Esta solución no es tan buena como la de leppie o abatishchev debajo. –

42

Reducir a la mitad el número de elementos que van debe generar (su segundo parámetro) y luego doblando los valores resultantes dará tanto el número correcto de artículos y garantizar un incremento de 2.

Enumerable.Range(0,5).Select(x => x * 2) 
+18

Números impares que quedan como un ejercicio para el lector. –

+1

¡No sé lo que estaba pensando! Mi downvote fue bloqueado hasta que la respuesta fue editada, así que agregué una explicación para poder revertirla. ¡Mis disculpas! –

25
Enumerable.Range(0, 10).Where(i => i % 2 == 0); // { 0, 2, 4, 6, 8 } 
Enumerable.Range(0, 10).Where(i => i % 2 != 0); // { 1, 3, 5, 7, 9 } 
+2

Esta es la mejor respuesta. Me gustaría agregar que puede usar esto para cualquier incremento, y es mejor que crear una clase personalizada que el código rígido se salte todos los demás elementos. Por ejemplo, si estoy escribiendo código para seleccionar los minutos en un TimeSpan, y solo quiero mostrar incrementos de 15 minutos: Enumerable.Range (0, 60) .Where (i => i% 15 == 0) – DaveH

6

El parámetro count en su código se ve como un end punto del ciclo.

public static MyExt 
{ 
    public static IEnumerable<int> Range(int start, int end, Func<int, int> step) 
    { 
    //check parameters 
    while (start <= end) 
    { 
     yield return start; 
     start = step(start); 
    } 
    } 
} 

Uso: MyExt.Range(1, 10, x => x + 2) devuelve números entre 1 a 10 con el paso 2 MyExt.Range(2, 1000, x => x * 2) devuelve números entre 2 a 1000 con multiplican 2 cada vez.

+0

Se colgará con x => x – Nickmaovich

+0

@Nickmaovich 'x => x' crea una colección infinita, sin embargo, todavía puede operarlo con' .First' '.Take''Skip' y etc. Enumerando una colección infinita sin ningún '' break' condición hace que el programa se cuelgue, sin embargo, es un resultado esperado, al igual que 'while (true)'. –

Cuestiones relacionadas