2011-06-25 48 views
23

我有一个列表(即Dim nList as new List(of className))。每个班级都有一个名为zIndex的属性(即className.zIndex)。是否可以通过列表的所有元素中的zIndex变量对列表中的元素进行排序?按类别值排序VB.net列表

回答

41

假设你有LINQ在您的处置:

Sub Main() 
    Dim list = New List(Of Person)() 
    'Pretend the list has stuff in it 
    Dim sorted = list.OrderBy(Function(x) x.zIndex) 
End Sub 

Public Class Person 
    Public Property zIndex As Integer 
End Class 

或者,如果LINQ是不是你的事:

Dim list = New List(Of Person)() 
list.Sort(Function(x, y) x.zIndex.CompareTo(y.zIndex)) 
'Will sort list in place 

LINQ提供了更多的灵活性;如果您想通过多件事物订购,可以使用ThenBy。它也使得语法稍微更清晰。

+0

我无法使用LINQ示例,我将如何启用该功能?我得到了第二个工作,虽然,谢谢:) – FreeSnow

+0

@DalexL这取决于你的目标框架版本。你需要3.5或更高。 VB.NET编译器应该为你导入System.Linq命名空间。 (查看项目属性的“参考”选项卡)。 – vcsjones

+0

好吧,我正在比较日期。当我使用我的行'a.Sort(Function(x,y)x.DelegationDate.CompareTo(y.DelegationDate))'时,它根本不排序。它保持原来的顺序。 –

8

您可以使用自定义比较排序列表:

nList.Sort(Function(x, y) x.zIndex.CompareTo(y.zIndex)) 
+0

如何启用LINQ? – FreeSnow

+0

@DalexL:您可以导入System.Linq命名空间。 – Guffa

+0

@DalexL:请注意,您不需要Linq来提供我建议的解决方案。 – Guffa

6

如果没有LINQ,那么你就可以实现IComparable(中类名)到类:

Public Class ClassName 
    Implements IComparable(Of ClassName) 

    'Your Class Stuff... 

    Public Function CompareTo(ByVal other As ClassName) As Integer Implements System.IComparable(Of ClassName).CompareTo 
    If _ZIndex = other.ZIndex Then 
     Return 0 
    Else 
     If _ZIndex < other.ZIndex Then 
     Return -1 
     Else 
     Return 1 
     End If 
    End If 
    End Function 
End Sub 

,然后从您的代码:

nList.Sort() 
+0

您可以将整个'CompareTo'方法缩短为'返回_ZIndex.CompareTo(other.ZIndex)' – vcsjones