sstas
@sstas

Как получить значения по новой экземпляру ключа в словаре?

Здравствуйте. Есть список объектов, которые нужно сохранить в массив с возможностью найти их по координатам, решил записать их в словарь и в качестве ключа задал класс с двумерными координатами, но при попытке получить значение по новому экземпляру ключа, выскакивает ошибка, что значение не найдено. Как можно решить проблему? Сохранять ещё и ссылки?

public class CellPos
{ 
    public int x;
    public int y;
}

...
public static Dictionary<CellPos, Cell> CellArray = new Dictionary<CellPos, Cell>();
...
CellArray.ContainsKey(new CellPos(1, 1));//false
  • Вопрос задан
  • 37 просмотров
Пригласить эксперта
Ответы на вопрос 2
freeExec
@freeExec
Участник OpenStreetMap
Почитайте как работает Dictionary и зачем нужны GetHashCode() и Equals().
Пока вы можете найти только тот же самый экземпляр, а не "по координатам".
Ответ написан
Комментировать
vabka
@vabka Куратор тега C#
Токсичный шарпист
Самый простой вариант - объявить CellPos как record:
public record struct CellPos(int X, int Y); //record struct, тк объект маленький и очень похож на value-object

Тогда его можно будет использовать как ключ в словаре.
Чуть сложнее вариант, или если ты используешь старую версию языка и рантайма (очень советую обновиться, если возможно):
Самому добавить методы GetHashCode и Equals.
Про то, как они должны работать, читай тут: https://docs.microsoft.com/en-us/dotnet/api/system...

Вариант три, если не можешь никак трогать CellPos - создай новый класс, который будет реализовывать интерфейс System.Collections.Generic.IEqualityComparer<CellPos> и передавай его в словарь (там параметр есть)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы