Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Замена dictionary c#

#c_sharp #wpf


я использую dictionary в C# для быстрой проверки существования элемента в массиве
по ключу, по факту значение ключа мне не нужно, выглядит это так:

public void update_object_select_contour(MyObject myObject)
    {
        List list_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 Вывод очевиден

Комментариев нет:

Отправить комментарий