Как найти индекс элемента списка, если он - объект

Есть список из списков из чисел, который заполнен некоторыми значениями:

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 шт):

Автор решения: aa_talanin

Полагаю, что вся проблема заключается в том, что экземпляры 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, но вообще работать будет и так.

→ Ссылка