2010-03-02 16 views
7

Hallo, ich frage mich, ob es eine einfachere Möglichkeit gibt, gerade/ungerade Zahlen anzuzeigen. Ich weiß, ich könnte eine for-Schleife machen und eine Liste laden. Dann kann ich eine andere für Schleife Schleife durch die Liste schreiben und prüfen, ob ein Wert ungerade/gerade:C# Ganzzahlen laden und ungerade/gerade anzeigen

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

Aber gibt es eine Möglichkeit, dies nur zu verkürzen, so dass ich einfach eine Liste von ungerade bekommen oder gerade Zahlen. Keine Hausaufgaben, die sich nur wundern.

Antwort

11

Könnten Sie irgendeine Art von Lambda-Ausdrücke verwenden:

//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); 

Die Enumerable lädt nur die Liste mit 1-100, und dann habe ich einfach alle Chancen/Evens schnappen und drucken Sie sie dann. Dies alles kann abgekürzt werden zu:

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 haben einen impliziten Typ var. Der Compiler kann seinen Typ bestimmen, so dass diese beiden Zeilen sind äquivalent zu:

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

Dann die Chancen finden/ausgleicht direkt an einen Listentyp:

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

und auszudrucken ist in meiner ersten aufgelistet Code.

+1

Ihr Prädikat für ungerade Zahlen enthält einen bösen Fehler. Sehen Sie, ob Sie es finden können. (Tipp: Sie brauchen mehr Testfälle.) –

+0

@Eric Lippert vielleicht num% 2 == 1 war eine schlechte Wahl ... als 2 == 1 gibt false zurück :). Will bearbeiten ... lass es mich wissen, wenn ich mich irre. – JonH

+1

Gut geraten, korrigieren Sie, aber keine Zigarre, weil Sie das Problem nicht wirklich diagnostizierten. Versuchen Sie Ihren ursprünglichen Code mit einem Bereich von -100 bis +100. –

15

Die LINQ Art und Weise ... gerade und ungerade Zahlen zwischen 1 und 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 ist schneller zu ersetzen i% 2 mit i & 1 in dein Beispiel –

+2

Lonli-Lokli aber dann braucht es zwei Kopfschalter um zu verstehen was los ist. Lesbarkeit ist wichtiger für solch eine unbedeutende Menge an Einsparungen. – JonH

+0

@JonH Guter Punkt, aber ich denke, die Leute sollten ermutigt werden, Dinge auf eine performante Art zu schreiben, vorausgesetzt, sie erklären es. zB: '// i & 1 == 0 ist schneller als i% 2 == 0' –

3

Sie LINQ verwenden können, nur die ungeraden oder geraden, zu ziehen und dann Prozess:

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

Füllen Sie Ihre Liste nach diesen Formeln

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

Ich glaube nicht, dass Sie die erste Schleife erstellen müssen. Sie konnte es einfach:

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

Oder auch:

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

Das Problem ist nicht die ungeraden oder geraden Indizes zu wählen, sondern die ungeraden oder geraden Elemente der Liste der ganzen Zahlen. –

+0

@Eric Lippert - Ah, ich verstehe. Vielen Dank. – davecoulter

0

Wenn Sie nur die Hälfte der Zahlen benötigen, nur um die Hälfte der Zahlen (..; ..; i = i + 2)

Wenn Sie alle Nummern benötigen, aber eine zusätzliche Schleife vermeiden möchten, können Sie diese während der ersten Schleife markieren oder verarbeiten.

Oder, während der Erstellung, bis zu drei Listen/Arrays - eine für alle Zahlen, eine andere für die Chancen, und die dritte für Evens.

Gibt es eine bestimmte Anwendung?

+0

Das Problem ist nicht, die geraden Indizes zu betrachten, das Problem ist, die geraden Elemente zu betrachten. –

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

Wie ist das nützlich, wenn eine Antwort von 12 upvotes dies bereits vor 2 Jahren gesagt hat? – jv42

+0

Ich verstehe, dass Sie daran arbeiten, einige Funktionen freizuschalten, vielleicht versuchen Sie auch einige neue/unbeantwortete Fragen :) –

Verwandte Themen