Сортировать список, где объект не является ничем - PullRequest
3 голосов
/ 02 марта 2011

Я пытаюсь отсортировать список классов, и мне нужны классы с подклассом, который не является ничем первым в списке. Я думал, что следующее будет работать, но это не так.

ListOfClasses.Sort(Function(x, y) If(x.SubClass IsNot Nothing, 1, 0))

Я знаю, что в лучшем случае это хак (не то, что это работает), но я думал, что это повысит классы в том порядке, в котором подкласс не будет равен нулю?

Ответы [ 3 ]

3 голосов
/ 02 марта 2011

Ваша функция сравнения должна возвращать -1, 0 или 1, если x меньше, равно или больше y. В вашем случае (поскольку вы хотите иметь Nothing значения сзади):

Dim xNull = x Is Nothing
Dim yNull = y Is Nothing

If xNull = yNull Then Return 0 ' either both are Nothing, or neither is.
If xNull Then Return 1
Return -1

Но учтите, что использование Sort здесь излишне неэффективно. Необходимая операция называется раздел и выполняется в O (n).

2 голосов
/ 02 марта 2011

Проблема в том, что ваш делегат-компаратор не следует правилам сравнения, перечисленным здесь .В частности, необходимо убедиться, что если вы говорите «х больше, чем у», вы также говорите «у меньше х».Здесь вы всегда говорите «х больше, чем у», но на самом деле вы никогда не говорите обратное.

Вот функция сравнения, которая будет правильно сортировать эти элементы

Function Compare(ByVal x as TheType, ByVal y as TheType) As Integer
  If x.SubClass Is Nothing AndAlso y.SubClass Is Nothing Then
    Return 0
  Else If x.SubClass IsNot Nothing AndAlso y.SubClass IsNot Nothing Then
    Return 0
  Else If x.SubClass IsNot Nothing Tehn
    Return -1
  Else
    Return 1
  End If 
End Function

Это также может быть выражено как лямбда-выражение, но так как они поддерживаются только в Visual Studio 2010, я решил написатьполная функция.

0 голосов
/ 02 марта 2011

Если все, что вам нужно, это все значения 'Nothing' в конце (и производительность не представляет большой проблемы в этой ситуации), вы можете использовать .Sort () по умолчанию в общем списке. Это даст вам «Ничего» значения на фронте. Затем вы звоните .Reverse в списке.

Dim ListOfClasses As New List(Of Object)
ListOfClasses.Add(Nothing)
ListOfClasses.Add("Something 1")
ListOfClasses.Add(Nothing)
ListOfClasses.Add("Something 2")
ListOfClasses.Add(Nothing)
ListOfClasses.Add("Something 3")

ListOfClasses.Sort()
ListOfClasses.Reverse()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...