#c_sharp
В общем, есть класс Obj, нужно создать коллекцию объектов Obj и переопределить метод сравнивания объектов. Ибо могут добавляться дубликаты и сравнивать надо по конкретными атрибутами (atr1, atr2), а не по всем. (желательно) P.S. пока что пользовался Obj[] array, но нужно решить проблему дубликатов. (да, в гугле все есть)
Ответы
Ответ 1
Здесь подойдет коллекция HashSet, которой в конструктор можно передать IEqualityComparerв котором можно определить правила сравнения объектов нужного типа. Пример реализации IEqualityComparer из MSDN: class BoxEqualityComparer : IEqualityComparer { public bool Equals(Box b1, Box b2) { if (b2 == null && b1 == null) return true; else if (b1 == null | b2 == null) return false; else if(b1.Height == b2.Height & b1.Length == b2.Length & b1.Width == b2.Width) return true; else return false; } public int GetHashCode(Box bx) { int hCode = bx.Height ^ bx.Length ^ bx.Width; return hCode.GetHashCode(); } } И при создании коллекции: var hashSet = new HashSet(new BoxEqualityComparer()); Теперь при добавлении в эту коллекцию объекта типа Box дубликат не добавится. Ответ 2
Альтернативное решение — использовать IEquatable, если у вас понятие равенства всё время одинаковое. class Obj : IEquatable { readonly int A1, A2, A3; public Obj(int a1, int a2, int a3) { A1 = a1; A2 = a2; A3 = a3; } // определяем сравнение public bool Equals(Obj that) { return that != null && this.A1 == that.A1 && this.A2 == that.A2; } // заодно нужно перегрузить унаследованное сравнение public override bool Equals(object obj) { return Equals(obj as Obj); } // при этом обязательно перегрузить GetHashCode // мы должны убедиться, что равные по Equals экземпляры имеют одинаковый хэшкод // поэтому в вычислениях участвует только A1 и A2 public override int GetHashCode() { var hash = 19; // избегаем хэш-коллизий, используем (небольшое) простое число hash = hash * 37 + A1.GetHashCode(); hash = hash * 37 + A2.GetHashCode(); return hash; } // чтобы увидеть результат public override string ToString() { return $"a1 = {A1}, a2 = {A2}, a3 = {A3}"; } } Ну и тестируем. В качестве контейнера без дубликатов берём HashSet : class Program { static void Main(string[] args) { var objects = new HashSet (); objects.Add(new Obj(1, 1, 10)); objects.Add(new Obj(1, 1, 100)); foreach (var obj in objects) Console.WriteLine(obj); } } В выводе лишь один экземпляр, как и нужно: a1 = 1, a2 = 1, a3 = 10 Если понятие равенства у вас «ситуативное», важное только для этого контейнера, лучше использовать идею с IEqualityComparer .
Комментариев нет:
Отправить комментарий