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

Đó là mã mà tôi đang cố gắng in ra thông tin xe hơi có giá thấp nhất. Nhưng không có gì được in ra.Cách tìm giá trị thấp nhất từ ​​danh sách?

+3

Không của 'một .price' là ít hơn 0. 'a.price <= Lowest_price' luôn là false. –

+0

Ngoài ra, bạn đang in 'a.price' - bạn không muốn in' giá_giá thấp nhất'? – Bridge

+0

Oh .. đúng !! nó luôn luôn là sai !! Cảm ơn!! – user2042721

Trả lời

32

Sử dụng phương pháp LINQ Min mở rộng:

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

Ngoài ra, bạn không nói rõ, nhưng điều này sẽ thất bại nếu bạn không có xe hơi trong thiết lập của bạn với một InvalidOperationException chỉ ra "Chuỗi không chứa yếu tố". Nếu có thể bạn không có xe hơi, cập nhật nhanh có thể là:

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

Là tại sao bạn hiện đang in gì đó là vì giá trị ban đầu của bạn là 0. Không có ô tô nào có giá trị là âm (hoặc nhỏ hơn 0). Nếu bạn muốn tiếp tục sử dụng vòng lặp hiện tại của bạn, thay đổi giá trị ban đầu với giá trị cao nhất có thể:

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 

Lưu ý rằng điều này có tác dụng phụ thêm rằng nếu list1 lại xe là trống, thì giá trị lowest_price sẽ là Double.MaxValue. Điều này có thể hoặc có thể không phải là một mối quan tâm cho bạn với mã hiện tại của bạn.

Nếu đó là một mối quan tâm, và cần trở 0 nếu không có xe, bạn có thể làm cho một sự điều chỉnh nhẹ:

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

Cảm ơn! Có anyway để làm cho nó được thực hiện với phương pháp vòng lặp? – user2042721

+0

@ user2042721: Yup, xem chỉnh sửa của tôi. –

+0

thanks !! tôi sẽ thử ngay lập tức! Đây là mẹo chính xác mà tôi đã học được hôm nay !! Cảm ơn một lần nữa! – user2042721

6

Bạn sẽ sử dụng phần mở rộng Min trong danh sách.

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

chỉ dựa trên các vấn đề với mã của bạn: bạn sẽ không có một mức giá thấp hơn 0 ... vì vậy bạn cần thay đổi nó thành:

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 

Sửa: điều này sẽ chỉ hoạt động nếu list1 tồn tại và không trống, để sử dụng chung, bạn cần phải kiểm tra if (list1 is null || list1.Count==0) dòng đầu tiên.

+0

Bạn có thể muốn kiểm tra xem danh sách có trống không trước hoặc điều này có thể ném ra ngoài phạm vi ngoại lệ – Charleh

+0

@Charleh: tuyệt đối, đây chỉ là bản sửa lỗi dựa trên ví dụ của OP (khi tất cả các mục được thêm trước hiển thị trong mã), được cập nhật. – Bolu

0

Các câu trả lời khác cung cấp giải pháp LINQ chính xác, nhưng vấn đề với mã cụ thể của bạn là bạn đang kiểm tra xem giá của chiếc xe (a.price) có phải là < = biến giá_biểu của bạn hay không. Biến giá_biểu của bạn được khởi tạo với giá trị bằng 0 và theo giá xe mặc định của bạn được liệt kê, tất cả đều lớn hơn 0, sẽ không bao giờ xác thực. Vì vậy, biến số_bạn_price của bạn sẽ không bao giờ được cập nhật và do đó không bao giờ ghi giá trị của nó vào bảng điều khiển. Đó là những gì gây ra yêu cầu của bạn về "không có gì in ra". Đó là một lỗi trong kiểm tra của bạn và trong logic của bạn. Cập nhật dòng đó thành "if (Lowest_price < = a.price)" để đến gần hơn.

2

Nếu bạn muốn sửa chữa mã của bạn để làm việc (thay vì sử dụng LINQ - đó là cách tiếp cận đề nghị), thay đổi dòng này:

double lowest_price = 0; 

này:

double lowest_price = double.MaxValue; 
Các vấn đề liên quan