2013-07-15 12 views
16
//create the new object for cars 
    Cars s1 = new Cars("Toyota", 2005, 500000, "White", "good");//Car1 Ob 
    Cars s2 = new Cars("Honda", 2004, 550000, "Black", "fine");//Car2 Ob 
    Cars s3 = new Cars("Nissen", 2012, 490000, "Yellow", "best");//Car3 Ob 
    Cars s4 = new Cars("Suzuki", 2012, 390000, "Blue", "fine");//Car4 Ob 
    Cars s5 = new Cars("BMW", 2012, 1000000, "Green", "Good");//Car5 Ob 

    //Create list to add objects into the memory 
    List<Cars> list1 = new List<Cars>(); 
    list1.Add(s1);list1.Add(s2);list1.Add(s3);list1.Add(s4);list1.Add(s5); 



//cars info which has the lowest price 
     double lowest_price = 0; 
     foreach(Cars a in list1){ 
     if(a.price <= lowest_price){ 
      lowest_price = a.price; 
      Console.WriteLine(a.price); 
      } 
     }//end of loop 

To jest kod, który próbuję wydrukować informacje o samochodzie, który ma najniższą cenę. Ale nic nie zostanie wydrukowane.Jak znaleźć najniższą wartość z listy?

+3

Żaden z 'a .price' jest mniejsze niż 0. 'a.price <= lowest_price' jest zawsze fałszywe. –

+0

Również drukujesz 'a.price' - czy nie chcesz wydrukować' lowest_price'? – Bridge

+0

Oh .. right !! zawsze jest fałszywe !! Dzięki!! – user2042721

Odpowiedz

32

Użyj metody LINQ Min rozszerzenia:

double lowest_price = list1.Min(car => car.price); 

Ponadto nie określono, ale to się nie powiedzie, jeśli nie mają samochody w zestawie z InvalidOperationException wskazującym „sekwencja zawiera żadnych elementów”. Jeśli to możliwe, nie masz samochód, szybki update może być:

double lowest_price = list1.Any() ? list1.Min(car => car.price) : 0; 

, dlaczego twój aktualny kod nie drukuje to dlatego, że wartość początkowa jest 0. Żaden samochód nie ma wartości, która jest negatywna (lub mniej niż 0). Jeśli chcesz nadal korzystać z istniejącej pętli, należy zmienić wartość początkową na najwyższą możliwą wartość:

double lowest_price = Double.MaxValue; 
foreach(Cars a in list1){ 
    if(a.price <= lowest_price){ 
     lowest_price = a.price; 
     Console.WriteLine(a.price); 
    } 
}//end of loop 

pamiętać, że ten ma dodatkowy efekt uboczny, że jeśli list1 samochodów jest pusty, wówczas wartość lowest_price będzie Double.MaxValue. To może, ale nie musi być problemem dla ciebie z twoim istniejącym kodem.

Jeśli jest to problemem, a trzeba wrócić 0 jeśli nie ma samochodów, można zrobić lekką korektę:

double lowest_price; 
if (list1.Any()){ 
    lowest_price = Double.MaxValue; 
    foreach(Cars a in list1){ 
     if(a.price <= lowest_price){ 
      lowest_price = a.price; 
      Console.WriteLine(a.price); 
     } 
    }//end of loop 
} 
else{ 
    lowest_price = 0; 
} 
+0

Dzięki! Czy mimo to można to zrobić za pomocą metody pętli? – user2042721

+0

@ user2042721: Tak, zobacz moją edycję. –

+0

dzięki! spróbuję tego od razu! To jest dokładnie sztuczka, której się dziś nauczyłem !! Dzięki jeszcze raz! – user2042721

6

byłoby użyć rozszerzenie minut na liście.

lowest_price = list1.Min(c => c.price); 
3

tylko na podstawie problemu z kodem: nie zamierzamy mieć niższą cenę niż 0 ... więc trzeba go zmienić na:

double lowest_price = list1[0].price; 
     foreach(Cars a in list1){ 
     if(a.price <= lowest_price){ 
      lowest_price = a.price; 
      Console.WriteLine(a.price); 
      } 
     }//end of loop 

Edytuj: to zadziała tylko, jeśli list1 istnieje i nie jest pusty, do ogólnego użytku musisz sprawdzić if (list1 is null || list1.Count==0) pierwszą linię.

+0

Prawdopodobnie chcesz sprawdzić, czy lista nie jest pusta jako pierwsza, lub może to spowodować wyjątek poza zasięgiem. – Charleh

+0

@Charleh: absolutnie, jest to tylko poprawka oparta na przykładzie OP (kiedy wszystkie elementy zostały dodane jako pierwsze pokazano w kodzie), zaktualizowany. – Bolu

0

Pozostałe odpowiedzi poprawnie dostarczają rozwiązania LINQ, ale problem z określonym kodem polega na sprawdzeniu, czy samochód ma wycenę (a.price) na < = twoja najniższa_wartość. Twoja zmienna lowest_price jest tworzona z wartością 0 i zgodnie z domyślnymi cenami samochodów, które są większe niż 0, nigdy nie zostanie zatwierdzona. Tak więc zmienna twoja najniższa_wartość nigdy nie będzie aktualizowana i dlatego nigdy nie zapisze jej wartości na konsoli. To właśnie powoduje twoją prośbę o "nic nie drukuje". To błąd w czeku i logice. Zaktualizuj tę linię do "if (lowest_price < = a.price)", aby się zbliżyć.

2

Jeśli chcesz naprawić swój kod do pracy (zamiast przy użyciu LINQ - co jest zalecane podejście), należy zmienić tę linię:

double lowest_price = 0; 

do tego:

double lowest_price = double.MaxValue; 
Powiązane problemy