2013-07-15 106 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 

這是我試圖打印出具有最低價格的汽車信息的代碼。但沒有打印出來。如何從列表中找到最低值?

+3

的'一無.price'小於0.'a.price <= lowest_price'總是爲false。 –

+0

另外您還打印'a.price' - 您不打印'lowest_price'嗎? – Bridge

+0

哦..對!它總是假的!謝謝!! – user2042721

回答

32

使用LINQ Min擴展方法:

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

而且,你沒有指定,但如果你沒有車在你的設置與InvalidOperationException表示「序列包含任何元素,」這將失敗。如果這是可能的,你有沒有汽車,快速更新可能是:

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

至於爲什麼你當前代碼打印什麼,那是因爲你的初始值是0。沒有汽車的值是負值(或小於0)。如果你想使用你現有的循環,保持,改變初始值可能的最高值:

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 

注意,這有額外的副作用,如果你的車list1,那麼lowest_price值將爲Double.MaxValue。這可能會或可能不會成爲您使用現有代碼的關注點。

如果它是一個關注,需要返回0如果沒有車,你可以做一個小幅調整:

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

謝謝!無論如何用循環方法來完成它? – user2042721

+0

@ user2042721:是的,看我的編輯。 –

+0

謝謝!!我會馬上嘗試一下!這是我今天學到的確切技巧!再次感謝! – user2042721

6

你會使用列表中的最小值擴展。

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

只是根據你的代碼的問題:你是不會有更低的價格比0 ......所以你需要將其更改爲:

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 

編輯:這隻會在list1存在並且不是空的時才起作用,因爲一般用途您需要檢查if (list1 is null || list1.Count==0)第一行。

+0

你可能想先查看一下列表是不是空的,或者這可能會拋出一個超出範圍的異常 – Charleh

+0

@Charleh:絕對,這只是一個基於OP的例子的修復(當所有的項目都被首先添加爲在代碼中顯示),已更新。 – Bolu

0

其他答案正確地提供了一個LINQ解決方案,但您的具體代碼的問題是,您正在檢查汽車的價格(a.price)是否爲< =您的最低價格變量。您的lowest_price變量的實例化值爲0,並且根據列出的大於0的默認汽車價格,永遠不會驗證。因此,您的lowest_price變量將永遠不會更新,因此絕不會將其值寫入控制檯。這是什麼導致你的請求「沒有打印出來」。這是你的支票和你的邏輯錯誤。將該行更新爲「if(lowest_price < = a.price)」以接近。

2

如果你想解決您的代碼工作(而不是使用LINQ的 - 這是建議的方法),改變這一行:

double lowest_price = 0; 

這樣:

double lowest_price = double.MaxValue;