2016-03-20 5 views
0

ドメインデータオブジェクトの束をソートしたいと思います。私はまず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を返します。私はそれには通常のenumがあるべきだと思います。

また、私のcomparerは標準のvb.net comparerを単に呼び出すべきだと思います。

その後、どのように(ドメインデータの)リストを並べ替えるのですか?

comparer?

答えて

1

まず、収益比較コードが矛盾していることに注意してください。小さなXでは-1が返されます。あなたはまた、その方法を絶対に必要としません。それを使用する次に

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 

:あなたは標準NET方法に依存したい場合は、あなたのメソッドは、クラスのメンバーになることができ

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

:これは、同じ結果を与える

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メソッドを使用して値を比較できます。あなたはSortメソッド呼び出しでそれを使用する比較を使用して、リストを並べ替えるには

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 

:最初の比較がゼロの場合は、他の比較を行う

myList.Sort(AddressOf CompareDomainCountry) 
関連する問題