я использую 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) Какой лучше использовать ключ для хранения положений координат? Как я знаю преобразовывать пары к тексту и хранить как текст не лучшая идея
Вы используете словарь. Словарь - это когда у вас есть ключ и есть значение, ассоциированное с ключом.
То, что вам нужно, называется 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
Вывод очевиден
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть ListBox который содержит список файлов прим(D:\text01
Недавно я нактнулся на одну интересную программу WinaberОна написана аж в далеком 1998 году