Поиск по списку из класса – List.Equals() – C# – Apadtive solutions

Поиск по списку из класса – List.Equals() – C#

1
1

В данной статье я поделюсь с вами легкой реализацией поиска по списку из вашего класса. Показывать я буду на примере своего проекта и у меня будет класс Device для примера.

Для начала в наш класс нужно наследовать интерфейс IEquatable<T>

Рассмотрим наш класс. Я в него внес четыре переменных типа string.

public class Device : IEquatable<Device>
    {
        public string id { get; set; } //device id or ip address for wireless
        public string device { get; set; } // code device name or status of connection like unauthorized or offline
        public string model { get; set; } // Model of the device 
        public string mode { get; set; } // Mode 
    }

Тут я уже пронаследовал свойства интерфейса IEquatable и указал в нем тип данных наш класс Device.

Рассмотрим переменные класса. Как я указал выше, у меня тут 4 переменных типа string. Для сравнения мы можем использовать либо какую-то одну или сразу несколько переменных. Я буду проводить сравнение с помощью двух переменных с названием: id и mode. В вашем случае определяйте переменные, которые будут по ожиданию стопроцентно отличаться в ходе сравнений.

Для начала переопределяем метод Equals() в нашем классе. В этом методе мы и будем проверять различаются ли наши переменные или объекты класса.

public bool Equals(Device other)
{
    return this.id.Equals(other.id) && this.mode.Equals(other.mode);
}

Данный метод как раз и проверяет, являются ли переменные одинаковыми или нет. В данный метод передается экземпляр класса, с которым мы будем сравнивать значения.

Далее нам нужно переопределить операции == и != для проверки через них. Для этого пишем следующее. (Заменяйте Device на свой класс!)

public static bool operator== (Device A, Device B)
{
    return A.id.Equals(B.id) && A.mode.Equals(B.mode);
}
public static bool operator!=(Device A, Device B)
{
     return !(A == B);
}

Данные методы точно также сравнивают объекты класса и возвращают bool true или false.

В итоге класс должен выглядить следующим образом:

public class Device : IEquatable<Device>
    {
        public string id { get; set; } //device id or ip address for wireless
        public string device { get; set; } // code device name or status of connection like unauthorized or offline
        public string model { get; set; } // Model of the device Like SM_G935F or any other
        public string mode { get; set; } // Mode
        
        public bool Equals(Device other)
        {
            return this.id.Equals(other.id) && this.mode.Equals(other.mode);
        }
        public static bool operator== (Device A, Device B)
        {
            return A.id.Equals(B.id) && A.mode.Equals(B.mode);
        }
        public static bool operator!=(Device A, Device B)
        {
            return !(A == B);
        }

    }

Далее покажу как нам сравнить списки классов. Для примера беру список DevicesList (новый список) и _devicelist (старый список). Мы будем спрашивать, появились ли новые объекты в списке, то есть изменился ли он.  Код, приведенный ниже, сравнивает два входящих списка и, по условию, если списки разные, то есть при сравнении результат false, то возвращается новый список (DeviceList). Если же списки одинаковые, то просто возвращается старый список.

if (!DevicesList.SequenceEqual(_devicelist))
      return _devicelist = DevicesList;
else return _devicelist;

Данный метод сравнения я использую для получения списка из adb (android device bridge) и при различии списков отправляю новый на замену старому. Вот полный код данного метода

public static List<Device> DevicesList
        {
            get
            {
                List<Device> DevicesList = new List<Device> { };
                string devs = CmdExecutor("devices -l");
                Regex DeviceConnectedRegex = new Regex(@"(?<id>\S*)\s*(?<mode>\w*)\sproduct:(?<device>\w*)\smodel:(?<model>\w*)\sdevice:(?<device1>\w*)\stransport_id:(?<trans_id>\d+)");
                Regex DeviceNoConnectionRegex = new Regex(@"(?<id>\w*)\s+(?<mode>.*)\stransport_id:(?<trans_id>\d+)");
                string[] devices = devs.Replace("List of devices attached\n", "").Split(Settings_Hand.separator, StringSplitOptions.RemoveEmptyEntries);
                foreach (string device in devices)
                {
                    if (DeviceConnectedRegex.IsMatch(device))
                    {
                        var newDevice = new Device()
                        {
                            id = DeviceConnectedRegex.Replace(device, "${id}"),
                            device = DeviceConnectedRegex.Replace(device, "${device}"),
                            model = DeviceConnectedRegex.Replace(device, "${model}"),
                            mode = DeviceConnectedRegex.Replace(device, "${mode}")
                        };
                        DevicesList.Add(newDevice);
                    }
                    else
                    {
                        var newDevice = new Device()
                        {
                            id = DeviceNoConnectionRegex.Replace(device, "${id}"),
                            mode = DeviceNoConnectionRegex.Replace(device, "${mode}")
                        };
                        DevicesList.Add(newDevice);
                    }


                }
                if (!DevicesList.SequenceEqual(_devicelist))
                    return _devicelist = DevicesList;
                else return _devicelist;
            }
        }