2016-03-20 25 views
0

我想排序一堆domainsdata對象。我想先根據countryCode排序,然後我想根據收入進行排序。如何優雅地在自定義比較器中對VB.net中的對象進行排序?

首先我創建了一個私人比較器。

Private Function CompareDomainCountry(ByVal x As domainsData, ByVal y As domainsData) As Integer 
    If x.countryCode < y.countryCode Then 
     Return -1 
    ElseIf y.countryCode < x.countryCode Then 
     Return 1 
    ElseIf x.revenue < y.revenue Then 
     Return 1 
    ElseIf y.revenue < x.revenue Then 
     Return -1 
    Else 
     Return 0 
    End If 
End Function 

這有幾個問題。

比較器返回1,-1,0。我認爲應該有一個正常的枚舉。

另外我覺得我的比較器應該簡單地調用標準的vb.net比較器。

然後,我該如何排序列表(domainsdata)?

比較?

回答

1

首先,請注意您的收入比較代碼不一致:較小的X應返回-1。你也並非絕對需要這種方法。這給了相同的結果:

Dim sorted = DomainList.OrderBy(Function(x) x.CountryCode). 
         ThenBy(Function(y) y.Revenue). 
         ToList() 

如果你想依靠一個標準NET方法,你的方法可以是一個類成員:

Public Class DomainComparer 
    Implements IComparer(Of Domain) 

    Public Function Compare(x As Domain, y As Domain) As Integer _ 
             Implements IComparer(Of Domain).Compare 
     ' all your code 
    End Function 
End Class 

然後使用它:

Dim dSorter = New DomainComparer 
DomainList.Sort(dSorter) 
' or simply: 
DomainList.Sort(New DomainComparer) 

Guffa先生的AddressOf方法更簡單,更簡潔;當有其他變量/屬性(如SortOrder)時,我喜歡類方法。

除非排序成員混合使用字母數字字符串(似乎不是基於名稱和比較的情況),否則結果以相同的方式(收入結果發生更改時)相同。

如果你希望用你的方法OrderBy(),我不認爲你可以 - 簽名不符合Func(Of T)(TKey)。然而,返回是統一的,大多數Compare()方法指示較大的值(DateTime表示較早/較早的日期;可能還有其他日期)。

1

您可以使用CompareTo方法來比較這些值。如果第一個比較是零,然後再做其他的比較:

myList.Sort(AddressOf CompareDomainCountry) 

Private Function CompareDomainCountry(ByVal x As domainsData, ByVal y As domainsData) As Integer 
    Dim result As Integer = x.countryCode.CompareTo(y.countryCode) 
    If result = 0 Then 
    result = x.revenue.CompareTo(y.revenue) 
    End If 
    Return result 
End Function 

要使用你使用它在Sort方法調用比較排序列表

相關問題