Как найти самое низкое значение из списка?
//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
Это код, который я пытаюсь распечатать информацию о машинах, которая имеет самую низкую цену. Но ничего не распечатывается.
Ответы
Ответ 1
Используйте метод 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;
}
Ответ 2
Вы должны использовать расширение Min в списке.
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)
первую строку.
Ответ 4
Если вы хотите исправить ваш код для работы (вместо использования Linq - это рекомендуемый подход), измените эту строку:
double lowest_price = 0;
:
double lowest_price = double.MaxValue;
Ответ 5
Другие ответы правильно предоставляют решение LINQ, но проблема с вашим конкретным кодом заключается в том, что вы проверяете, соответствует ли цена автомобиля (a.price) переменной <= your low_price. Ваша переменная low_price создается со значением 0 и в соответствии с вашими ценами на автомобиль по умолчанию, которые больше, чем 0, никогда не будет проверяться. Таким образом, ваша переменная low_price никогда не будет обновлена и поэтому никогда не будет записывать ее в консоль. То, что вызывает ваш запрос "ничего не распечатывает". Это ошибка в вашей проверке и в вашей логике. Обновите эту строку до "if (lower_price <= a.price)", чтобы приблизиться.
Ответ 6
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();
}
}