Замена dictionary c#

230
25 мая 2021, 15:40

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

public void update_object_select_contour(MyObject myObject)
    {
        List<Vector2i> list_position_tmp = myObject.list_position;
        Dictionary<string, byte> dictionary_position_tmp = new Dictionary<string, byte>();
        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<string>

2) Какой лучше использовать ключ для хранения положений координат? Как я знаю преобразовывать пары к тексту и хранить как текст не лучшая идея

Answer 1

Вы используете словарь. Словарь - это когда у вас есть ключ и есть значение, ассоциированное с ключом.

То, что вам нужно, называется HashSet<T>.

Если вы хотите хранить в HashSet<T> координаты, то тогда координаты желательно должны быть целыми числами, так как дробные числа могут быть не равны даже если они были посчитаны по одной и той же формуле просто из за наличия погрешности.

Но вот с целыми числами проще. Но тут нужно иметь ввиду, так как, если вы будете хранить координаты в HashSet<T>, который использует хеш функцию для хранения и хеш функцию и функцию эквивалентности для поиска элементов, вас в классе координат надо перегрузить методы 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<Coordinates2D>

var set = new HashSet<Coordinates2D>();
set.Add(new Coordinates2D(10, 25));
Console.WriteLine(set.Contains(new Coordinates2D(1, 1))); // false
Console.WriteLine(set.Contains(new Coordinates2D(10, 25))); // true

Вывод очевиден

READ ALSO
Перегрузить декремент

Перегрузить декремент

Имеется функция извлечения элемента из стека

127
C# - listbox - экспорт файлов в посторонний софт

C# - listbox - экспорт файлов в посторонний софт

Есть ListBox который содержит список файлов прим(D:\text01

128
C# - Защита форм и контролов от изменения. От Winabler и её аналогов

C# - Защита форм и контролов от изменения. От Winabler и её аналогов

Недавно я нактнулся на одну интересную программу WinaberОна написана аж в далеком 1998 году

100
Долгая загрузка приложения asp.net core

Долгая загрузка приложения asp.net core

Всем приветОпубликовал приложение ASP

172