Как найти индекс элемента списка, если он - объект
Есть список из списков из чисел, который заполнен некоторыми значениями:
List<List<int>> cells = new List<List<int>>();
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
cells.Add(new List<int> { y, x });
}
}
Когда я пытаюсь получить индекс элемента верхнего списка функция IndexOf возвращает -1:
Console.Write(cells.IndexOf(new List<int>{4, 5}));
Но список с элементами 4 и 5 содержится в верхнем списке. Поэтому дело не в непопадании чисел. Полагаю, что вся проблема заключается в том, что экземпляры List разные. Есть ли способ решить эту проблему или возможно есть лучший способ хранения координат?
Ответы (1 шт):
Полагаю, что вся проблема заключается в том, что экземпляры List разные.
Правильно полагаете.
Есть ли способ решить эту проблему или возможно есть лучший способ хранения координат?
Самый простой способ - хранить несколько координат не в списке (этим вы выделяете память в куче, которую потом надо будет собирать, а также делаете нетривиальным поиск точки, потому что объекты List действительно разные), а в структуре (тип значения, value type, ключевое слово struct):
struct Point
{
public int X;
public int Y;
public Point(int x, int y) => (X, Y) = (x, y);
}
В таком случае сравнение будет происходить не по ссылке, а по значению, а также сами экземпляры структуры будут размещены внутри области памяти листа, не приводя к фрагментации кучи.
По-хорошему еще можете определить на структуре методы Equals и GetHashCode, но вообще работать будет и так.