.net 对象不是空的排序列表

.net 对象不是空的排序列表,.net,vb.net,generics,list,lambda,.net,Vb.net,Generics,List,Lambda,我正在尝试对类列表进行排序,我需要具有子类的类,该子类不是列表中的第一个无。我原以为下面的方法行得通,但行不通 ListOfClasses.Sort(Function(x, y) If(x.SubClass IsNot Nothing, 1, 0)) 我知道这充其量只是一种黑客行为(并不是说它有效),但我认为它会将类按子类不等于零的顺序上移?这里的问题是您的comparer委托没有遵循所列的正确比较规则。特别需要确保的是,如果你说‘x大于y’,你也会说‘y小于x’。这里你只说“x大于y”,但你

我正在尝试对类列表进行排序,我需要具有子类的类,该子类不是列表中的第一个无。我原以为下面的方法行得通,但行不通

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

我知道这充其量只是一种黑客行为(并不是说它有效),但我认为它会将类按子类不等于零的顺序上移?

这里的问题是您的comparer委托没有遵循所列的正确比较规则。特别需要确保的是,如果你说‘x大于y’,你也会说‘y小于x’。这里你只说“x大于y”,但你从来没有说相反的话

下面是一个比较器函数,它将正确地对这些元素进行排序

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

这也可以表示为lambda语句,但由于它们仅在VisualStudio2010中受支持,所以我选择编写一个完整的函数

如果
x
小于、等于或大于
y
,则比较器函数需要返回-1、0或1。在您的情况下(因为您希望后面没有
值):


但是请注意,在这里使用
排序
是不必要的低效。您需要的操作将被调用并在O(n)中运行。

如果您只需要最后的所有“Nothing”值(在这种情况下,性能不是一个大问题),那么您可以在通用列表上使用default.Sort()。这将在前面为您提供“Nothing”值。然后你打电话,在名单上倒过来

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()

性能不是一个大问题,我会使用它,但排序需要发生在子类上。列表类类型总是有一个值。啊,好的,谢谢你,这对我来说已经澄清了很多。我希望使用lambda表达式,但由于我使用的是2008,所以不可能。我将研究lambda的未来声明,它们听起来很有趣…谢谢,我明白你对比较器函数的看法。不确定如何使用分区函数,稍后将仔细研究。@baileyswalk分区函数使用一个布尔谓词,它只返回当前对象是否为
null
。然后,分区的算法只是从数组两端线性传递数组,根据该谓词交换元素。由于它也用于快速排序,Wikipedia的文章中有一个带有伪代码的部分:(但这不是使用任意谓词,而是与枢轴进行比较)。
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()