如何从列表中查找最低值
本文关键字:查找 最低值 列表 | 更新日期: 2023-09-27 18:22:27
//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
这是我尝试打印出价格最低的汽车信息的代码。但是什么都没有打印出来。
使用 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;
}
您将在列表中使用 Min 扩展名。
lowest_price = list1.Min(c => c.price);
如果要修复代码以使其正常工作(而不是使用 Linq - 这是推荐的方法(,请更改以下行:
double lowest_price = 0;
对此:
double lowest_price = double.MaxValue;
只是基于你的代码问题:你不会有低于 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)
第一行。
其他响应正确地提供了 LINQ 解决方案,但特定代码的问题是,您正在检查汽车的价格 (a.price( 是否<= 您的lowest_price变量。您的 lowest_price 变量以值 0 实例化,根据列出的默认汽车价格(均大于 0(,将永远不会验证。因此,您的lowest_price变量将永远不会更新,因此永远不会将其值写入控制台。这就是导致您要求"不打印任何内容"的原因。这是你的检查和逻辑中的一个错误。将该行更新为"if (lowest_price <= a.price("以更接近。
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();
}
}
var result = list1.Where((x) => x.price== list1.Min(y => y.price)).ToList();
这将以最低价格返回汽车信息。添加引用using System.Linq;