2010-03-02 15 views
7

Hola, me pregunto si existe una manera más fácil de mostrar números impares/pares. Sé que podría hacer un ciclo for y cargar una lista. Entonces puedo escribir otro bucle for para recorrer la lista y comprobar si un valor es par/impar:C# Cargar números enteros y mostrar impar/par

for(i=0; i<100; i++) 
if(myList[i]%2==0) //even 
    //do something 
else 
    //odd do something 

Pero ¿hay alguna manera de acortar esto sólo para que yo pueda conseguir fácilmente una lista de extraña o incluso números. No es tarea solo preguntando.

Respuesta

11

Podría utilizar algún tipo de lambdas:

//load a list, t, with 100 integers 
List<int> t = Enumerable.Range(1, 100).ToList(); 

//find odd numbers 
var oddNumbers = t.Where(num => num%2 != 0); 

//find even numbers 
var evenNumbers = t.Where(num => num%2 == 0); 

//print odd numbers 
foreach (int i in oddNumbers) 
    Console.WriteLine(i); 

//print even numbers 
    foreach(int i in evenNumbers) 
     Console.WriteLine(i); 

El Enumerable simplemente carga la lista con 1-100, y luego simplemente arrebatar todo pronóstico/iguala y luego imprimirlas. Todo esto se puede acortar a:

var e = Enumerable.Range(1, 100).Where(num => num%2==0); //for even numbers 
var o = Enumerable.Range(1, 100).Where(num => num%2!=0); //for odd numbers 

e, o tienen un tipo implícito var. El compilador puede determinar su tipo por lo que estas dos líneas son equivalentes a:

List<int> eo = Enumerable.Range(1, 100).ToList(); //must tell it its a list 

Luego de encontrar las probabilidades/iguala directamente a un tipo de lista:

List<int> o = eo.Where(num => num%2!=0).ToList(); 
List<int> e = eo.Where(num => num%2==0).ToList(); 

e imprimirlo aparece en mi inicial código.

+1

Su predicado para números impares contiene un desagradable error. Ve si puedes encontrarlo. (Pista: necesitas más casos de prueba.) –

+0

@Eric Lippert tal vez num% 2 == 1 fue una mala elección ... ya que 2 == 1 devuelve falso :). Editaré ... avísame si estoy equivocado. – JonH

+1

Buena conjetura, solución correcta, pero no cigarro porque en realidad no diagnosticaste el problema. Pruebe su código original con un rango que va de -100 a +100. –

15

La forma LINQ ... números pares e impares entre 1 y 100.

var even = Enumerable.Range(1,100).Where(i => i % 2 == 0); 
var odd = Enumerable.Range(1,100).Where(i => i % 2 != 0); 
+0

Es más rápido reemplazar i% 2 con i & 1 en su ejemplo –

+2

Lonli-Lokli, pero luego se necesitan dos interruptores de cabeza para entender qué está pasando. La legibilidad es más importante para una cantidad tan insignificante de ahorros. – JonH

+0

@JonH Buen punto, pero creo que las personas deben ser alentadas a escribir las cosas de manera efectiva, siempre que lo expliquen. por ejemplo: '// i & 1 == 0 es más rápido que i% 2 == 0' –

3

Puede utilizar LINQ para sacar sólo el par o impar, y luego proceso:

var even = myList.Where(i => i%2==0); 
foreach(var number in even) 
    // do something 
0

Complete su lista de acuerdo con estas fórmulas

Odds[0->N] = 2*i+1 
Evens[0->N] = 2*i 
1

No creo que tenga que crear el primer ciclo. Se podía:

for (i=1; i < 101; i++) 
{ 
    if (i % 2 != 0) 
    { 
     //do something 
    } 
} 

O incluso:

for (i=1, i < 101, i+=2) 
{ 
    //do something 
} 
+0

El problema no es elegir los índices impares o pares, es elegir los elementos impares o pares de la lista de enteros. –

+0

@Eric Lippert - Ah, ya veo. Gracias. – davecoulter

0

Si sólo necesita la mitad de los números, simplemente generan la mitad de los números (..; ..; i = i + 2)

Si necesita todos los números pero desea evitar un bucle adicional, puede marcarlos o procesarlos durante el ciclo inicial.

O, durante la creación, haga hasta tres listas/matrices, una para todos los números, otra para probabilidades y la tercera para evens.

¿Hay una aplicación específica?

+0

El problema no es mirar los índices pares, el problema es mirar los elementos pares. –

3
var t = Enumerable.Range(1, 100).ToList(); 
var oddNumbers = t.Where(n => (n & 1) != 0).ToList(); 
var evenNumbers = t.Where(n => (n & 1) == 0).ToList(); 
+0

¿Cómo es útil, cuando una respuesta de 12 votos positivos dice esto hace 2 años? – jv42

+0

Entiendo que estás trabajando para desbloquear algunas características, tal vez también intentes algunas preguntas nuevas/sin respuesta :) –

Cuestiones relacionadas