如何从列表中找到最低值?

时间:2013-07-15 16:16:59

标签: c#

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

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

7 个答案:

答案 0 :(得分:47)

使用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;
}

答案 1 :(得分:10)

您可以在列表中使用Min扩展名。

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

答案 2 :(得分: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)第一行。

答案 3 :(得分:2)

如果您想修复您的代码(而不是使用Linq - 这是推荐的方法),请更改此行:

double lowest_price = 0;

到此:

double lowest_price = double.MaxValue;

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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();
    }
}

答案 6 :(得分:0)

var result = list1.Where((x) => x.price== list1.Min(y => y.price)).ToList();

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