У меня есть структура IntVector2, которая имеет свойство X и Y. Оператор + перекрывается сList.Contains не работает, как ожидалось, с помощью настраиваемого аргумента struct
public static IntVector2 operator +(IntVector2 value1, IntVector2 value2)
{
value1.X += value2.X;
value1.Y += value2.Y;
return value1;
}
При использовании этого в списке с содержит метод, он не проверяет общую стоимость добавления, но только переменная «текущая»
if (visited.Contains(current + dir))
continue;
Что на самом деле здесь?
Редактировать: Вот скриншот значений переменных и объявление переменной, которое равно тому, что я ожидаю от значения, которое содержится для проверки.
https://dl.dropboxusercontent.com/u/30062610/Brokestuff.png
Edit2: Вот полный код метода, это начало из A * первопрохождение алгоритм нахождения конечного вектора из стартового вектора.
public Path Pathfind(IntVector2 start, IntVector2 end)
{
Queue<IntVector2> fillQueue = new Queue<IntVector2>();
List<IntVector2> visited = new List<IntVector2>();
fillQueue.Enqueue(start);
IntVector2 current;
while (fillQueue.Count > 0)
{
current = fillQueue.Dequeue();
foreach (IntVector2 dir in Directions)
{
if (GetCell(current + dir).IsWall)
continue;
else
{
IntVector2 newstuff = current + dir;
if (visited.Contains(current + dir))
continue;
if ((current + dir) == end)
{
//We've reached the target, traceback the path and return it.
}
visited.Add(current);
fillQueue.Enqueue(current + dir);
}
}
}
return null;
}
Редактировать 3: Даже используя переменную newstuff, которая имеет другое значение с самого начала, продолжается. Я не уверен, что это может сделать. Мои равны переопределяют только проверки, если X и Y равны и возвращают true, если это так.
Вот совокупность кода IntVector2: http://pastebin.com/ic108SeF
Редактировать 4: Я изменил оператор + к:
public static IntVector2 operator +(IntVector2 value1, IntVector2 value2)
{
return new IntVector2((value1.X + value2.X), (value1.Y + value2.Y));
}
И проблема все еще сохраняется.
Почему вы изменяете 'значение1'? –
Вы изменили определение 'Equals'? '((1,1) + (2,2)). Равные (3,3)' дают для меня «истину». – Rob
Я решил изменить первый аргумент со значением второго. Должен ли я изменить его, чтобы вернуть новый IntVector2 с новой суммой вместо изменения первой? – user3010006