Nonpacie
@Nonpacie

Как найти объект класса в листе по одному или по нескольким его полям?

Имею такой код:
class Garage
    {
        private List<Car> cars;

        public void AddCar(string carModel, string color, double speed, int yearOfIssue)
        {
            Car car = new Car(carModel, color, speed, yearOfIssue);
            cars.Add(car);
        }

        public void DeleteCar(string carModel, string color, double speed, int yearOfIssue)
        {
           
        }
    }

    class Car
    {
        public Car()
        {
            
        }

        public Car(string carModel, string color, double speed, int yearOfIssue)
        {
            this.carModel = carModel;
            this.color = color;
            this.speed = speed;
            this.yearOfIssue = yearOfIssue;
        }

        private string carModel;
        private string color;
        private double speed;
        private int yearOfIssue;
    }

В нём нужно реализовать метод DeleteCar чтобы пользователь при вызове функции вводил все 4 поля или какой-то из них и после чего объект в листе находился и удалялся, как это можно реализовать и с помозью чего?
  • Вопрос задан
  • 658 просмотров
Решения вопроса 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Где то примерно так.
public class Garage
    {
        public Garage()
        {
            _cars = new List<Car>();
        }
        private readonly List<Car> _cars;

        public void AddCar(string carModel, string color, double speed, int yearOfIssue)
        {
            var car = new Car(carModel, color, speed, yearOfIssue);
            _cars.Add(car);
        }

        public void DeleteCar(string carModel, string color = "", double speed = 0, int yearOfIssue = 0)
        {
            var query = from c in _cars
                        where c.CarModel.StartsWith(carModel)
                        select c;

            if (color != string.Empty)
                query = query.Where(cl => cl.Color == color);

            if (speed > 0)
                query = query.Where(sp => Math.Abs(sp.Speed - speed) < 0.2);
            if (yearOfIssue > 0)
                query = query.Where(y => y.YearOfIssue == yearOfIssue);
            var results = query.Select(f => f).ToList();
            foreach (var car in results) _cars.Remove(car);
        }
    }

    public class Car
    {
        public Car()
        {
        }

        public Car(string carModel, string color, double speed, int yearOfIssue)
        {
            this._carModel = carModel;
            this._color = color;
            this._speed = speed;
            this._yearOfIssue = yearOfIssue;
        }

        private string _carModel;
        public string CarModel => _carModel;
        private string _color;
        public string Color => _color;
        private double _speed;
        public double Speed => _speed;
        private int _yearOfIssue;
        public int YearOfIssue => _yearOfIssue;

    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@NonameProgrammer
Сложно вы ему дали, конечно. list.Remove(FirstOrDefault(lambdaExpression)) (пишу с телефона могу ошибиться)
нде лямбда нужно делать сравнения. А лучше передать делагат функции.
Ответ написан
Комментировать
Используя LINQ:
CarCollection.Where(x => x.color == "red").First();
Ответ написан
Комментировать
@justmavi
Software Development Engineer at Softconstruct
Может лучше будет, чтобы ты создал для каждой машины универсальный идентификатор? Будет в разы проще работать с ними и результат выполнения будет максимально точным (так ведь возможно, что точно такую же машину в гараже будет больше 2 и при вызове функции твоя система может удалить совсем не ту машину, которую нужно).

А это ответ на твой вопрос
public void DeleteCar(string carModel, string color, double speed, int yearOfIssue)
{
    Car car = cars.FirstOrDefault(c => c.CarModel == carModel && c.Color == color && c.Speed == speed && c.YearOfIssue == yearOfIssue); 
    cars.Remove(car);
}
Ответ написан
Therapyx
@Therapyx
Data Science
1) Делаешь итерацию листа
2) На каждом индексе машины делаешь запросы аттрибутов через getcarModel() из класса машины. Гетеры и сетеры конечно же надо добавить в класс Car
В итоге внутри for(foreach) loop, по типу:
cars[indexNr].getcarModel()
3) Проверяешь на соответствие с сохраненными параметрами, которые ввёл пользователь. Так как у тебя 0..n, то я бы делал, что-то на подобии
"если строка не пустая", то сравни cars[indexNr].getcarModel() из пункта 2 с введенной пользователем строкой.
4) Если хоть 1 из параметров внутри for loop'e не совпадает, то continue.
5) Если все параметры были найдены в каком-либо из обьектов, то
cars.RemoveAt(Актуальный индекс из фор лупа);

Но можно сделать все куда проще и еффективнее. Например в каждой машине сделать уникальный индекс, который бы отображался бы пользователю. К примеру машина, которая она ищет = айди 12. А айди 12 это ничто иное как позиция в листе. Тогда можно было бы обойтись одной строкой
cars.RemoveAt(Index); в функции DeleteCar
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы