2010-03-02 9 views
7

Witam zastanawiam się, czy istnieje łatwiejszy sposób wyświetlania liczb nieparzystych/parzystych. Wiem, że mógłbym zrobić pętlę for i załadować listę. Wtedy mogę napisać kolejny pętli pętli listy i sprawdzić, czy wartość jest parzyste/nieparzyste:C# Załaduj liczby całkowite i wyświetl parzyste/nieparzyste

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

Ale czy jest jakiś sposób, aby skrócić ten się po prostu tak, że można łatwo uzyskać listę nieparzysty lub nawet liczby. Nie zadanie domowe tylko zastanawiające.

Odpowiedz

11

można użyć jakiegoś 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); 

enumerable tylko ładuje listę z 1-100, a potem po prostu wyrwać wszystkie kursy/Evens, a następnie wydrukować je. To wszystko można skrócić do:

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 mają domyślny typ var. Kompilator może określić jego typ więc te dwie linie są równoważne:

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

Następnie znaleźć kursy/wyrównuje bezpośrednio do typu listy:

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

I wydrukować go wymienionego w mój początkowy kod.

+1

Twój predykat liczb nieparzystych zawiera nieprzyjemny błąd. Sprawdź, czy możesz go znaleźć. (Podpowiedź: potrzebujesz więcej przypadków testowych.) –

+0

@Eric Lippert być może numer% 2 == 1 był złym wyborem ... jako 2 == 1 zwraca fałsz :). Zmienię ... daj mi znać, jeśli się mylę. – JonH

+1

Zgadnij, popraw poprawkę, ale bez cygara, ponieważ tak naprawdę nie zdiagnozowałeś problemu. Wypróbuj oryginalny kod z zakresem od -100 do +100. –

15

LINQ sposób ... parzystych i nieparzystych liczb z zakresu od 1 do 100.

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

Szybciej zastępować i% 2 z i i 1 w twoim przykładzie –

+2

Lonli-Lokli, ale wtedy potrzeba dwóch przełączników, żeby zrozumieć, co się dzieje. Czytelność jest ważniejsza dla tak niewielkiej ilości oszczędności. – JonH

+0

@JonH Dobra sprawa, ale myślę, że ludzie powinni być zachęcani do pisania rzeczy w sposób efektywny, o ile to wyjaśnia. np: '// i & 1 == 0 jest szybsze niż i% 2 == 0' –

3

Można używać LINQ wyciągnąć tylko nieparzyste lub parzyste, a następnie proces:

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

Zapełnij listę zgodnie z tymi wzorami:

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

Nie sądzę, że musisz utworzyć pierwszą pętlę. Może po prostu:

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

Albo nawet:

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

Problem polega nie na wybieraniu liczb nieparzystych, a nawet indeksów, to na wybieraniu nieparzystych, a nawet elementów listy liczb całkowitych. –

+0

@Eric Lippert - Ach, rozumiem. Dzięki. – davecoulter

0

Jeśli potrzebujesz tylko połowę liczby, tylko generują połowę liczby (..; ..; i = i + 2)

Jeśli potrzebujesz wszystkich liczb, ale chcesz uniknąć dodatkowej pętli, możesz je oznaczyć lub przetworzyć podczas początkowej pętli.

Lub, podczas tworzenia, uzupełnij do trzech list/tablic - jedną dla wszystkich liczb, drugą dla kursów, a trzecią dla wszystkich.

Czy istnieje specjalna aplikacja?

+0

Problemem nie jest spojrzenie na równomierne wskaźniki, problemem jest patrzeć na równe elementy. –

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

Jak to jest przydatne, gdy odpowiedź na 12 głosów na żywo powiedzieli to już 2 lata temu? – jv42

+0

Rozumiem, że pracujesz nad odblokowaniem niektórych funkcji, być może też wypróbuj nowe/nieodebrane pytania :) –

Powiązane problemy