2013-07-15 58 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;