按对象属性对(对象)列表进行排序

Mec*_*eer 1 vb.net sorting properties list

我正在努力实现一些已经给出答案的事情。但它已经出现了c#,我对此一无所知,c#所以我正在寻找 vb.net 的替代品。

我打了一个class电话BomItem,它有几个属性,如数量、描述等。

我将它们添加BomItems到 a 中List(of BomItem),但现在我想根据属性对它们进行排序。如何根据属性对项目进行排序ItemNumber

这是我找到的解决方案的链接c#

我的班级代码

Public Class BomItem
    Public Property ItemNumber As String
    Public Property Description As String
    Public Property Quantity As Double
    Public Property Material As String
    Public Property Certificate As String
End Class
Run Code Online (Sandbox Code Playgroud)

我如何添加BomRow对象

    _NewBomList.Add(New BomItem() With {
                    .ItemNumber = oRow.ItemNumber,
                    .Description = oPropSet.Item("Description").Value,
                    .Quantity = oRow.TotalQuantity,
                    .Material = oPropSet.Item("Material").Value,
                    .Certificate = CustomPropertySet.Item("Cert.").Value})
Run Code Online (Sandbox Code Playgroud)

比较器

Public Class NaturalSort

Implements IComparer

Public Function Compare(ByVal x As Object,
            ByVal y As Object) As Integer Implements IComparer.Compare

    ' [1] Validate the arguments.
    Dim s1 As String = x
    If s1 = Nothing Then
        Return 0
    End If

    Dim s2 As String = y
    If s2 = Nothing Then
        Return 0
    End If

    Dim len1 As Integer = s1.Length
    Dim len2 As Integer = s2.Length
    Dim marker1 As Integer = 0
    Dim marker2 As Integer = 0

    ' [2] Loop over both Strings.
    While marker1 < len1 And marker2 < len2

        ' [3] Get Chars.
        Dim ch1 As Char = s1(marker1)
        Dim ch2 As Char = s2(marker2)

        Dim space1(len1) As Char
        Dim loc1 As Integer = 0
        Dim space2(len2) As Char
        Dim loc2 As Integer = 0

        ' [4] Collect digits for String one.
        Do
            space1(loc1) = ch1
            loc1 += 1
            marker1 += 1

            If marker1 < len1 Then
                ch1 = s1(marker1)
            Else
                Exit Do
            End If
        Loop While Char.IsDigit(ch1) = Char.IsDigit(space1(0))

        ' [5] Collect digits for String two.
        Do
            space2(loc2) = ch2
            loc2 += 1
            marker2 += 1

            If marker2 < len2 Then
                ch2 = s2(marker2)
            Else
                Exit Do
            End If
        Loop While Char.IsDigit(ch2) = Char.IsDigit(space2(0))

        ' [6] Convert to Strings.
        Dim str1 = New String(space1)
        Dim str2 = New String(space2)

        ' [7] Parse Strings into Integers.
        Dim result As Integer
        If Char.IsDigit(space1(0)) And Char.IsDigit(space2(0)) Then
            Dim thisNumericChunk = Integer.Parse(str1)
            Dim thatNumericChunk = Integer.Parse(str2)
            result = thisNumericChunk.CompareTo(thatNumericChunk)
        Else
            result = str1.CompareTo(str2)
        End If

        ' [8] Return result if not equal.
        If Not result = 0 Then
            Return result
        End If
    End While

    ' [9] Compare lengths.
    Return len1 - len2

End Function

End Class
Run Code Online (Sandbox Code Playgroud)

Ale*_* B. 5

使用LINQ OrderBy

\n\n
_NewBomList.OrderBy(Function(bi) bi.ItemNumber)\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于降序:

\n\n
_NewBomList.OrderByDescending(Function(bi) bi.ItemNumber)\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您想在字符串中使用数字顺序,则必须首先将其转换为整数:

\n\n
_NewBomList.OrderBy(Function(bi) Integer.Parse(bi.ItemNumber))\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑:
\n要为 OrderBy 扩展提供自定义,IComparer您必须创建一个类来实现要比较的IComparer(Of String)String ItemNumbers

\n\n
 Class ItemNumberComparer  \n     Implements IComparer(Of String)\n\n     Public Function Compare(String x, String y)\n         Dim ix As String() = x.Split("."C)\n         Dim iy As String() = y.Split("."C)\n\n         Dim maxLen As Integer = Math.Max(ix.Length, iy.Length)\n         For i As Integer = 0 To maxLen - 2\n             If ix.Length >= i AndAlso iy.Length >= i Then\n                If Integer.Parse(ix(i)) < Integer.Parse(iy(i)) Then\n                   Return -1 \'If x.i is LT y.i it must be smaller at all\n                ElseIf Integer.Parse(ix(i)) > Integer.Parse(iy(i)) Then\n                   Return 1 \'If x.i is GT y.i it must be bigger all\n                End If\n             End If\n         Next\n         \'This code is only executed if x and y differ at last number or have different \xc2\xb4number of dots\n        If ix.Length = iy.Length Then\n            Return Integer.Parse(ix(ix.Length - 1)).CompareTo(Integer.Parse(iy(iy.Length - 1))) \'Only last number differs\n       Else\n           Return ix.Length.CompareTo(iy.Length) \'The number with more dots is smaller\n       End If\n\n     End Function     \n  End Class\n
Run Code Online (Sandbox Code Playgroud)\n\n

调用语法:

\n\n
Dim comparer = new ItemNumberComparer()\n_NewBomList.OrderByDescending(Function(bi) bi.ItemNumber, comparer)\n
Run Code Online (Sandbox Code Playgroud)\n