VB.NET中的多维数组排序

Posted

技术标签:

【中文标题】VB.NET中的多维数组排序【英文标题】:Sort Multidimensional Array in VB.NET 【发布时间】:2017-08-27 23:11:58 【问题描述】:

我有一个像这样的 2X50 数组-

R-125212,11
C-254645,25
R-456598,96
M-456878,35
O-980857,89
And so on...

现在我想用第二列的值对这个数组进行排序。所以输出应该看起来像-

R-125212,11
C-254645,25
M-456878,35
O-980857,89
R-456598,96
And so on...

如何用 VB.NET 轻松做到这一点?如果有其他更好的方法可以在不使用数组的情况下获得类似的结果,那也会对我有所帮助。

【问题讨论】:

这些值的实际含义是什么?使用类是否更有意义? 数组的第二列(如果我们认为它像一个表)只包含整数。我想按第二列值的降序对数组进行排序 那么第一列是什么? 那包含字符串,如果将数据类型更改为整数可以让我轻松排序,我可以这样做。 类型无关紧要。它是唯一标识符吗?如果是这样,那么创建一个类,你可以对一个属性进行排序 【参考方案1】:

代码:

Public Function Sort2DimArray(SA As Array, order As Boolean, sc0 As Integer, Optional sc1 As Integer = -1, Optional sc2 As Integer = -1) As Array

    Dim cols As Integer = SA.GetLength(1) - 1
    Dim rows As Integer = SA.GetLength(0) - 1
    Dim na(rows, cols) As String
    Dim a(rows) As String
    Dim b(rows) As Integer
    Dim c As Integer = 1
    If sc1 > -1 Then c = c + 1
    If sc2 > -1 Then c = c + 1

    For x = 0 To rows
        If c = 1 Then a(x) = SA(x, sc0)
        If c = 2 Then a(x) = SA(x, sc0) & SA(x, sc1)
        If c = 3 Then a(x) = SA(x, sc0) & SA(x, sc1) & SA(x, sc2)
        b(x) = x
    Next
    Array.Sort(a, b)
    If order = False Then
        For x = 0 To rows
            For y = 0 To cols
                na(x, y) = SA(b(x), y)
            Next
        Next
    Else
        For x = 0 To rows
            For y = 0 To cols
                na(rows - x, y) = SA(b(x), y)
            Next
        Next
    End If
    Sort2DimArray = na
End Function

【讨论】:

【参考方案2】:

您的问题有很多可能的解决方案,但根据我的经验,最好的方法是使用System.Data.DataTable

Dim dtb As New System.Data.DataTable
dtb.Columns.Add("Column1")
dtb.Columns.Add("Column2", GetType(Integer))
dtb.Rows.Add("Z-123456", 2)
dtb.Rows.Add("R-125212", 11)
dtb.Rows.Add("C-254645", 25)
dtb.Rows.Add("R-456598", 96)
dtb.Rows.Add("M-456878", 35)
dtb.Rows.Add("O-980857", 89)
Dim dvw As DataView = dtb.DefaultView
dvw.Sort = "Column2 ASC"
Dim dtbSorted As DataTable = dvw.ToTable()
DataGridView1.DataSource = dtbSorted

【讨论】:

最好不要使用DataTable,除非您直接从数据库中读取数据。如果您可以通过其他方式填充DataTable,那么您可以填充专用类型的实例集合。 @jmcilhinney - 是的,可以创建自定义类并实现 IComparable 等,但 DataTable 的编码要快得多,而且更容易。 为什么需要实现IComparable?排序将由StringInteger 属性完成,并且两者都已实现IComparable。如果您不想要,您甚至不需要自定义类,这要感谢Tuple。创建排序 List(Of Tuple(Of String, Integer)) 的代码将比使用 DataTable 更简单。 顺便说一下,您对包含数字的文本列进行排序的示例仅在每个值的长度相同时才有效。如您所见,“10”在排序中将排在“9”之前。 最终我想有很多方法可以解决这个问题。您对整数排序是正确的 - DataTable 确实支持其列的大多数数据类型(甚至是自定义类型/类 IIRC),我会更新我的答案。【参考方案3】:

我建议使用List(Of Tuple) 而不是数组。它更有活力。请检查此代码:

Sub SortList()
    'Declare the List Of Tuple with a Tuple of Char, Integer, Integer
    Dim lstToSort As New List(Of Tuple(Of Char, Integer, Integer))
    'Example to Add items
    lstToSort.Add(Tuple.Create("R"c, 250645, 11))
    lstToSort.Add(Tuple.Create("C"c, 125212, 25))
    'Sort is just 1 line
    lstToSort = lstToSort.OrderBy(Function(i) i.Item2).ToList
    'Loop through the elements to print them
    For Each tpl As Tuple(Of Char, Integer, Integer) In lstToSort
        Console.WriteLine(tpl.Item1 & "-" & tpl.Item2 & "," & tpl.Item3)
    Next
End Sub

编辑:鉴于您对问题的编辑,这里的代码是固定的:

Sub SortList()
    'Declare the List Of Tuple with a tuple of String, Integer
    Dim lstToSort As New List(Of Tuple(Of String, Integer))
    'Example to add items
    lstToSort.Add(Tuple.Create("R-250645", 11))
    lstToSort.Add(Tuple.Create("C-125212", 25))
    'Sort is just 1 line
    lstToSort = lstToSort.OrderBy(Function(i) i.Item2).ToList
    'Loop through the elements to print them
    For Each tpl As Tuple(Of String, Integer) In lstToSort
        Console.WriteLine(tpl.Item1 & "," & tpl.Item2)
    Next
End Sub

试一试,让我知道你的 cmets

【讨论】:

我相信这会奏效。但我将在我的解决方案中使用之前的答案,因为这为我提供了一些次要的好处。 这对于我遇到的类似问题非常有效! @JerryT 很高兴它帮助了你 不知道 Tuple,谢谢!

以上是关于VB.NET中的多维数组排序的主要内容,如果未能解决你的问题,请参考以下文章

Java中的多维数组按某列排序的方法

C,如何将多维数组传递给 CLR/类库项目中的函数

如何针对 C、C++ 或 Fortran 中的另一个多维数组快速对多维数组进行十亿点排序?

PHP按多维数组中的值排序[重复]

在PHP中的每个级别递归地对多维数组进行排序

多维数组排序