2010-03-02 3 views
7

Bonjour demande s'il y a un moyen plus facile d'afficher/impairs numéros pairs. Je sais que je pourrais faire une boucle for et charger une liste. Ensuite, je peux écrire un autre pour la boucle en boucle dans la liste et vérifier si une valeur est impair/pair:C# entiers de charge et afficher impair/pair

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

Mais est-il possible de raccourcir ce juste pour que je puisse obtenir facilement une liste bizarre ou des nombres pairs. Pas de devoirs, je me demandais juste.

Répondre

11

Pouvez-vous utiliser une sorte 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); 

Les charges Enumerable juste la liste avec 1-100, puis j'arracher simplement toutes les cotes/Evens puis les imprimer. Tout cela peut être raccourci à:

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 avoir un type implicite var. Le compilateur peut déterminer son type de sorte que ces deux lignes sont équivalentes à:

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

Alors pour trouver les cotes/égalise directement à un type de liste:

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

Et pour l'imprimer est listé dans mon premier code.

+1

Votre prédicat pour les nombres impairs contient un bogue méchant. Regarde si tu peux le trouver. (Conseil:. Vous avez besoin plus de cas de test) –

+0

@Eric Lippert peut-être 2% num == 1 était un mauvais choix ... comme 2 == 1 renvoie false :). Will edit ... laissez-moi savoir si je me trompe. – JonH

+1

Bonne supposition, correction à apporter, mais pas de cigare parce que vous ne diagnostiquez pas vraiment le problème. Essayez votre code original avec une gamme allant de -100 à +100. –

15

La façon LINQ ... numéros pairs et impairs entre 1 et 100.

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

Il est plus rapide de remplacer i% 2 avec i & 1 dans votre exemple –

+2

Lonli-Lokli mais alors il faut deux commutateurs de tête pour comprendre ce qui se passe. La lisibilité est plus importante pour une quantité insignifiante d'économies. – JonH

+0

@JonH Bon point, mais je pense que les gens devraient être encouragés à écrire des choses d'une manière performante, à condition qu'ils expliquent. par exemple: '// i & 1 == 0 est plus rapide que i% 2 == 0' –

3

Vous pouvez utiliser LINQ pour sortir juste pair ou impair, puis processus:

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

Remplissez votre liste selon ces formules

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

Je ne pense pas que vous deviez créer la première boucle. Vous pouvez tout simplement:

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

Ou encore:

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

Le problème n'est pas de choisir les indices pairs ou impairs, c'est de choisir les éléments pairs ou impairs de la liste des entiers. –

+0

@Eric Lippert - Ah, je vois. Merci. – davecoulter

0

Si vous avez seulement besoin la moitié des chiffres, juste générer la moitié des chiffres (..; ..; i = i + 2)

Si vous avez besoin tous les chiffres, mais veulent éviter une boucle supplémentaire, vous pouvez les marquer ou les traiter au cours de la boucle initiale.

Ou, lors de la création, constituent trois listes/tableaux - un pour tous les numéros, un autre pour chances, et le troisième pour Evens.

Y at-il une application spécifique?

+0

Le problème n'est pas de regarder les indices pairs, le problème est de regarder les éléments pairs. –

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

Comment cela est-il utile, quand une réponse de 12 upvotes l'a dit il y a déjà 2 ans? – jv42

+0

Je comprends que vous travaillez pour débloquer certaines fonctionnalités, essayez peut-être aussi quelques nouvelles questions/questions sans réponse :) –

Questions connexes