2017-02-16 4 views
1

私はオブジェクトのリストを持っています。私はカスタムプロパティでソートされた1つのプロパティを持つ2つのプロパティでソートしようとしています。リストにはReqTypeとPartNumberのプロパティがあります。 ReqTypeは "M"、 "B"、 "S"、またはnullになります。リストをこの順番でソートしたいと思います。次にPartNumberで並べ替えます。vb.netカスタムオーダーのオブジェクトリストの並べ替え

Input list: 
PartNumber ReqType 
124   B 
125   M 
123   B 
121   S 
120   M 
115    

Expected Sort: 
PartNumber ReqType 
120   M 
125   M 
123   B 
124   B 
121   S 
115    

私は以下のコードで開始しましたが、ReqTypeはアルファベット順に並べ替えられます。

Return EBom.OrderBy(Function(f) f.ReqType).ThenBy(Function(f) f.PartNumber).ToList 

次に、以下のコードを使用してカスタムソート順を作成する方法が見つかりました。 Ebom.Sort()を使用しても、PartNumberの2番目の並べ替え順序はわかりません。おそらくPartNumberのソートをカスタム関数に追加することができたと思いますが、それは多くの作業のようです。

EBom.Sort() 
Return EBom.ToList 


Implements IComparable(Of EBomList) 
Public Function SortReq(other As EBomList) As Integer Implements IComparable(Of EBomList).CompareTo 
    If (Me.ReqType = other.ReqType) Then 
     Return 0 
    ElseIf (Me.ReqType = "M") Then 
     Return -1 
    ElseIf (Me.ReqType = "B") Then 
     If (other.ReqType = "M") Then 
      Return 1 
     Else 
      Return -1 
     End If 
    ElseIf (Me.ReqType = "S") Then 
     If (other.ReqType = "M" Or other.ReqType = "B") Then 
      Return 1 
     Else 
      Return -1 
     End If 
    Else 
     Return 1 
    End If 
End Function 

カスタムオーダーでソートまたは少なくとも.thenby(.....)私が好きな順序を取得するとカスタムソート機能を組み合わせるための簡単な方法はありますか?

答えて

1

ちょうどReqTypesのリストを作成し、インデックスを検索:

Dim sortOrder = "MBS " 

Dim sortedList = List.OrderBy(Function(x) sortOrder.IndexOf(If(x.ReqType Is Nothing, " ", x.ReqType))).ThenBy(Function(x) x.PartNumber).ToList() 

注:chars以外のものでソートする場合、比較するオブジェクトのリスト/リストを作成する必要があります。

1

これを行うためのクリーナーコードバージョンは、次のようなソート方法で関数を使用することです。

タイプコードが同じ場合は、部品番号を確認する必要があります。

あなたのPartnumberが実際には数字であると仮定しています。文字列の場合は、必要に応じてそれをパッドする必要があります。例えば。

Return X.PartNumber.PadLeft(6," "c).CompareTo(Y.PartNumber.PadLeft(6," "c)) 

ALTERNATIVEと高速APPROACH

あなたは多くのデータを持っている場合は、ソート・キーを作成するためにEBomLitを増強ではなく、しかし、その文字列の検索を行うことを検討することをお勧めします...

で...

Private _ReqType As String 
Private _TypeKey As Integer 

Public Property ReqType As String 
    Get 
     Return _ReqType 
    End Get 
    Set(value As String) 
     _ReqType = value 
     _TypeKey = InStr("MBS ", value.PadLeft(1, " "c)) 
    End Set 
End Property 

Public ReadOnly Property TypeKey As Integer 
    Get 
     Return _TypeKey 
    End Get 
End Property 

として

その後ソートが...

なりFASTER STILL

あなたも、パッド入りの「製品型番」と「TypePadで」のうち、完全なソート・キーを作成することによって、そのさらに拡張し、全体シェバングを保存するためのキーとしてそれらを使用することができます

d.Sort(Function(X As EBomList, Y As EBomList) 
       Select Case X.TypeKey 
        Case Is < Y.TypeKey : Return -1 
        Case Is > Y.TypeKey : Return 1 
        Case Else : Return X.PartNumber.CompareTo(Y.PartNumber) 
       End Select 
      End Function) 

リストの代わりにSortedDictionary

0

少し簡単EnumTupleのものがオプションである場合:

Enum PartNumber As Byte : M : B : S : __ : End Enum 

Dim list = New List(Of Tuple(Of PartNumber, Integer)) From { 
    Tuple.Create(PartNumber.B, 124), 
    Tuple.Create(PartNumber.M, 125), 
    Tuple.Create(PartNumber.B, 123), 
    Tuple.Create(PartNumber.S, 121), 
    Tuple.Create(PartNumber.M, 120), 
    Tuple.Create(PartNumber.__, 115)} 

list.Sort() 

For Each item In list 
    Debug.Print(item.Item2 & vbTab & item.Item1.ToString.Replace("_", "")) 
Next 

が出力:

120 M 
125 M 
123 B 
124 B 
121 S 
115 
関連する問題