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)
_NewBomList.OrderBy(Function(bi) bi.ItemNumber)\nRun Code Online (Sandbox Code Playgroud)\n\n对于降序:
\n\n_NewBomList.OrderByDescending(Function(bi) bi.ItemNumber)\nRun Code Online (Sandbox Code Playgroud)\n\n如果您想在字符串中使用数字顺序,则必须首先将其转换为整数:
\n\n_NewBomList.OrderBy(Function(bi) Integer.Parse(bi.ItemNumber))\nRun Code Online (Sandbox Code Playgroud)\n\n编辑:
\n要为 OrderBy 扩展提供自定义,IComparer您必须创建一个类来实现要比较的IComparer(Of String)String ItemNumbers:
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\nRun Code Online (Sandbox Code Playgroud)\n\n调用语法:
\n\nDim comparer = new ItemNumberComparer()\n_NewBomList.OrderByDescending(Function(bi) bi.ItemNumber, comparer)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
10107 次 |
| 最近记录: |