#c_sharp #wpf
я использую dictionary в C# для быстрой проверки существования элемента в массиве по ключу, по факту значение ключа мне не нужно, выглядит это так: public void update_object_select_contour(MyObject myObject) { Listlist_position_tmp = myObject.list_position; Dictionary dictionary_position_tmp = new Dictionary (); for (int i = 0; i < list_position_tmp.Count; i++) { dictionary_position_tmp.Add(list_position_tmp[i].ToString(), 0); } if(dictionary_position.ContainsKey(new Vector2i(5, 5).ToString())) { //Поиск элемента по ключу } } То есть я закидываю координаты точек в dictionary и потом проверяю есть ли они там по нужному мне поиску и у меня есть 2 вопроса: 1) Какую структуру хранения данных можно использовать для этого?(пытался найти деревья в C#, так и не нашел) Хотелось бы чтобы выглядело это примерно так: Dictionary 2) Какой лучше использовать ключ для хранения положений координат? Как я знаю преобразовывать пары к тексту и хранить как текст не лучшая идея
Ответы
Ответ 1
Вы используете словарь. Словарь - это когда у вас есть ключ и есть значение, ассоциированное с ключом. То, что вам нужно, называется HashSet. Если вы хотите хранить в HashSet координаты, то тогда координаты желательно должны быть целыми числами, так как дробные числа могут быть не равны даже если они были посчитаны по одной и той же формуле просто из за наличия погрешности. Но вот с целыми числами проще. Но тут нужно иметь ввиду, так как, если вы будете хранить координаты в HashSet , который использует хеш функцию для хранения и хеш функцию и функцию эквивалентности для поиска элементов, вас в классе координат надо перегрузить методы Equals и GetHashCode. Вот пример: public class Coordinates2D { public int X { get; } public int Y { get; } public Coordinates2D(int x, int y) { X = x; Y = y; } protected bool Equals(Coordinates2D other) { return X == other.X && Y == other.Y; } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; if (obj.GetType() != this.GetType()) return false; return Equals((Coordinates2D) obj); } public override int GetHashCode() { unchecked { return (X * 397) ^ Y; } } } Теперь этот класс можно использовать в HashSet var set = new HashSet (); set.Add(new Coordinates2D(10, 25)); Console.WriteLine(set.Contains(new Coordinates2D(1, 1))); // false Console.WriteLine(set.Contains(new Coordinates2D(10, 25))); // true Вывод очевиден
Комментариев нет:
Отправить комментарий