2011-06-25 48 views
23

Tôi có một danh sách (ví dụ: Dim nList as new List(of className)). Mỗi lớp học có một tài sản có tên là zIndex (ví dụ: className.zIndex). Có thể sắp xếp các phần tử của danh sách theo biến zIndex trong tất cả các phần tử của danh sách không?Sắp xếp Danh sách VB.net theo giá trị lớp

Trả lời

41

Giả sử bạn có LINQ theo ý của bạn:

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 

Hoặc nếu LINQ không phải là điều bạn:

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

LINQ cung cấp linh hoạt hơn; chẳng hạn như có thể sử dụng ThenBy nếu bạn muốn đặt hàng nhiều hơn một điều. Nó cũng làm cho một cú pháp hơi sạch hơn.

+0

Tôi không thể sử dụng ví dụ LINQ, làm cách nào để bật tính năng này? Tôi đã nhận được một thứ hai để làm việc mặc dù, nhờ :) – FreeSnow

+0

@ DalexL Nó phụ thuộc vào phiên bản khung bạn đang nhắm mục tiêu. Bạn cần 3,5 hoặc cao hơn. Trình biên dịch VB.NET nên nhập không gian tên System.Linq cho bạn. (Nhìn vào tab Tài liệu tham khảo của thuộc tính của Dự án). – vcsjones

+0

OK, tôi đang so sánh ngày tháng. Khi tôi sử dụng dòng của tôi 'a.Sort (Hàm (x, y) x.DelegationDate.CompareTo (y.DelegationDate))', nó không phân loại gì cả. Nó để nó theo thứ tự ban đầu. –

8

Bạn có thể sử dụng một so sánh tùy chỉnh để sắp xếp danh sách:

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

Tôi làm cách nào để bật LINQ? – FreeSnow

+0

@DalexL: Bạn nhập không gian tên 'System.Linq'. – Guffa

+0

@DalexL: Lưu ý rằng bạn không cần LINQ cho giải pháp mà tôi đã đề xuất. – Guffa

6

Nếu không LINQ, sau đó bạn có thể thực hiện IComparable (Tất ClassName) để lớp học của bạn:

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 

và sau đó từ mã của bạn:

nList.Sort() 
+0

Bạn có thể rút ngắn toàn bộ phương thức 'CompareTo' đó thành' Return _ZIndex.CompareTo (other.ZIndex) ' – vcsjones

Các vấn đề liên quan