34
 //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

这就是我试图打印出价格最低的汽车信息的代码。但是什么都没有打印出来。

4

7 回答 7

70

使用LINQMin扩展方法:

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;
}
于 2013-07-15T16:18:01.750 回答
15

您将使用列表中的 Min 扩展名。

lowest_price = list1.Min(c => c.price);
于 2013-07-15T16:19:19.847 回答
4

只是基于您的代码的问题:您的价格不会低于 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)第一行。

于 2013-07-15T16:20:52.393 回答
4

If you want to fix your code to work (instead of using Linq - which is the recommended approach), change this line:

double lowest_price = 0;

to this:

double lowest_price = double.MaxValue;
于 2013-07-15T17:33:21.230 回答
1

其他响应正确地提供了 LINQ 解决方案,但您的特定代码的问题是您正在检查汽车的价格 (a.price) 是否 <= 您的最低价格变量。您的最低价格变量被实例化为 0 值,并且根据您列出的默认汽车价格都大于 0,将永远不会验证。因此,您的最低价格变量将永远不会更新,因此永远不会将其值写入控制台。这就是导致您要求“没有打印出来”的原因。这是您的检查和逻辑中的错误。将该行更新为“if (lowest_price <= a.price)”以更接近。

于 2013-07-15T16:26:01.827 回答
1
var result = list1.Where((x) => x.price== list1.Min(y => y.price)).ToList();

这将以最低的价格返回汽车信息。添加参考using System.Linq;

于 2020-07-09T18:01:34.983 回答
1
public  static int FindMin(IEnumerable<int> numbers)
    {
        Expression<Func<int, int, int>> expression = (left, right) => left < right ? left : right;
        InvocationExpression invoker = Expression.Invoke(expression,
                                   Expression.Constant(numbers.First())
                                  , Expression.Constant(numbers.ToList()[1]));

        foreach (int number in numbers.Skip(2))
        {
            invoker = Expression.Invoke(expression,
                               invoker,
                               Expression.Constant(number));
        }
        var lambdaExpression = Expression.Lambda<Func<int>>(invoker);
        Console.WriteLine($"Expression call tree:{lambdaExpression.ToString()}");
        return lambdaExpression.Compile().Invoke();
    }
}
于 2019-07-11T19:36:41.253 回答