У меня есть список настраиваемых типов объектов, скажем
Dim a As New List(Of CustomType)
заполняется экземплярами. У меня есть класс сравнения, который наследует
Public Class CustomTypeComparer
Implements IComparer(Of CustomType)
Public Function Compare(x As CustomType, y As CustomType) As Integer Implements IComparer(Of CustomType).Compare
...
End Function
End Class
который называется с помощью
a.Sort(New CustomTypeComparer)
метод. Единственный метод компаратора Compare()
вызывается автоматически, однако иногда метод дает сбой, потому что x
не определено или «не установлено в экземпляр объекта».
Я просмотрел отсортированный список, чтобы проверить, что ни один из элементов не является Ничто, подтверждено просмотром a.Contains(Nothing)
, который возвращает False
, и проверен с использованием других компараторов, которые смотрят на другие части объекта, ни у одного из них нет проблем со списком, только это один.
Как я могу изучить проблему глубже? Есть ли какие-нибудь идеи, которые люди могут дать по этому вопросу?
Обновление:
Читая справочный исходный код платформы, метод сортировки списка использует базовый метод Array.Sort()
. Взяв подсказку, я попытался использовать метод List.TrimExcess()
в списке, это изменило поведение, и IComparer не передаёт Nothing
. Комментатор обнаружил, что IComparers должны сравнивать пустые значения, что в сочетании с базовой границей массива больше, чем у массива, и молча содержит Nothing
s в нем для создания ожидаемой функциональности.
Nothing
в компараторе (поскольку вы все равно должны это делать) и не беспокойтесь об этом :) - person Steven Doggart   schedule 06.06.2018List(Of T)
, вы можете сами прочитать код. Код для реализации класса .NET Core, Mono и .NET Framework доступен в Интернете. Очевидно, что нет никакой гарантии, что все они реализованы одинаково, поэтому вашему компаратору было бы лучше предположить, что ему может быть передано значение null. - person Steven Doggart   schedule 06.06.2018