Как найти самое низкое значение из списка? - программирование
Подтвердить что ты не робот

Как найти самое низкое значение из списка?

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

Это код, который я пытаюсь распечатать информацию о машинах, которая имеет самую низкую цену. Но ничего не распечатывается.

4b9b3361

Ответ 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();
    }
}