Проблема в том, что List<T>
не переопределяет Equals
и GetHashCode
, и это то, что List<T>
будет использовать при попытке найти предмет. (Фактически, он будет использовать компаратор равенства по умолчанию, что означает, что он будет использовать реализацию IEquatable<T>
, если объект реализует его, и при необходимости вернется к object.Equals
/ GetHashCode
). Equals
вернет false, когда вы пытаетесь удалить другой объект, и реализация по умолчанию - просто сравнить ссылки.
По сути, вам нужно написать метод для сравнения двух списков на равенство и использовать его, чтобы найти индекс записи, которую вы хотите удалить. Затем вы удалите по индексу (используя RemoveAt
). РЕДАКТИРОВАТЬ: Как отмечено, Enumerable.SequenceEqual
может быть использован для сравнения списков. Это не так эффективно, как могло бы быть из-за того, что изначально не проверяли, равны ли значения, когда их можно легко вычислить. Кроме того, если вам нужно только сравнить значения List<int>
, вы можете избежать вызова виртуального метода для сравнения равенства.
Другая альтернатива - избегать использования List<List<int>>
, во-первых - используйте List<SomeCustomType>
, где SomeCustomType
включает a List<int>
. Затем вы можете реализовать IEquatable<T>
в такого типа . Обратите внимание, что это также может позволить вам инкапсулировать соответствующую логику в пользовательский тип. Я часто обнаруживаю, что в зависимости от типа, который у вас есть «вложенные» типы коллекций, пользовательский тип более эффективно инкапсулирует , что означает внутренней коллекции.