Vb.Net排序3x一维数组

时间:2014-03-18 21:20:49

标签: arrays vb.net sorting icomparable

我有3个一维数组。 每个包含与其他2个数组相对应的信息。 例如,阵列1包含客户名 数组2包含客户的姓氏 阵列3包含客户电话号码。

这不是我的实际例子,但最容易解释。 如何对所有三个数组进行排序,以便按照客户姓氏的顺序对它们进行排序。 如果史密斯先生已经排序并且从姓名阵列中的位置10移动到位置5,我希望他的电话号码和名字也在相应阵列中的第5位。

我正在处理包含10,000个项目的数组,所以我想避免循环(我当前的方法),因为这非常慢。

希望使用array.sort方法。

有人可以帮助我吗?

好的 - 所以我尝试使用新的数据类型,但我仍然不知道如何使用它立即过滤。下面是我的示例代码,它有几个问题。如果有人可以解决 - 它很想知道你是如何做到的。

代码的目的是返回包含分组问题的数组。 为简单起见,我在示例中假设找到的每个常量都是一个问题。 如果发现问题,请将其与同一工作表上的其他问题结合使用。 例如,在表1中的单元格A1和A2中找到数字2.该数组应返回A1:A2。 如果在表1中的A1和表2中的A2中找到问题,则将返回两个单独的数组条目。

Test File and Code Here

Public Type Issues
    ws_Sheet As Integer
    rng_Range As String
    s_Formula As String
    s_Combined As String
    d_ItemCount As Double
End Type

Sub IssuesFound()

Dim MyIssues() As Issues
Dim i_SheetCount As Integer
Dim s_Formula As String
Dim rng_Range As Range
Dim d_IssueCounter As Double
Dim s_SearchFor As String
Dim a_TempArray() As Issues
Dim d_InsertCounter As Double


d_IssueCounter = -1

' Loop All Sheets Using A Counter Rather Than For Each
For i_SheetCount = 1 To ActiveWorkbook.Sheets.Count

    ' Loop all Constants On Worksheet
    For Each rng_Range In Sheets(i_SheetCount).Cells.SpecialCells(xlCellTypeConstants, 23)

        If d_IssueCounter = -1 Then
            ' First Time and Issue Is Found, Start Recording In An Array
            d_IssueCounter = d_IssueCounter + 1
            ReDim MyIssues(0)
            MyIssues(0).ws_Sheet = i_SheetCount
            MyIssues(0).rng_Range = rng_Range.AddressLocal
            MyIssues(0).s_Formula = rng_Range.Value
            MyIssues(0).s_Combined = i_SheetCount & "#" & rng_Range.Value
            MyIssues(0).d_ItemCount = 0

        Else
            ' Going To Look For Issues Found On The Same Sheet with The Same Constant Value
            s_SearchFor = i_SheetCount & "#" & rng_Range.Value

            ' HELP HERE: Need To Ideally Return Whether The Above Search Term Exists In The Array
            ' Without looping, and I want to return the position in the array if the item is found
             a_TempArray = MyIssues 'Filter(MyIssues.s_Combined, s_SearchFor, True, vbTextCompare)

            If IsVarArrayEmpty(a_TempArray) = True Then
                ' New Issue Found - Increase Counter By + 1
                d_IssueCounter = d_IssueCounter + 1

                ' Increase The Array By 1
                ReDim Preserve MyIssues(d_IssueCounter)

                ' Record The Information About The Constant Found. Sheet Number, Constant, Range, and also a combined string for searching and the array position
                MyIssues(0).ws_Sheet = i_SheetCount
                MyIssues(0).rng_Range = rng_Range.AddressLocal
                MyIssues(0).s_Formula = rng_Range.Value
                MyIssues(0).s_Combined = i_SheetCount & "#" & rng_Range.Value
                MyIssues(0).d_ItemCount = 0

            Else
                ' Get The Array Position Where Other Issues With The Same Worksheet and Constant are Stored
                d_InsertCounter = a_TempArray.d_ItemCount

                ' Add The New Found Constant To The Range Already Containing The Same Constants on This Worksheet
                MyIssues(d_InsertCounter).rng_Range = Union(rng_Range, Range(MyIssues(d_InsertCounter).rng_Range)).AddressLocal

            End If

        End If
    Next

Next

End Sub

Function IsVarArrayEmpty(ByRef anArray As Issues)

Dim i As Integer

On Error Resume Next
    i = UBound(anArray, 1)
    If Err.Number = 0 Then
        IsVarArrayEmpty = False
    Else
        IsVarArrayEmpty = True
    End If

End Function

Sample Test File and Code Here

1 个答案:

答案 0 :(得分:2)

根据建议,您根本不应该使用并发数组。您应该定义具有三个属性的类型,然后创建该类型的单个数组或集合。

要回答你的问题,没有办法对三个阵列进行排序,但有一种方法可以对两个阵列进行排序。这意味着您可以创建要用作键的数组的副本,然后使用该副本对其中一个数组进行排序,将原始数据排序为另一个数组。查看带有两个数组作为参数的Array.Copy重载的文档。

也就是说,复制数组然后再进行两次排序是一个很大的开销,所以你可能从这个方法中获得的收益不大。最好是首先以正确的方式进行,即使用复杂类型的单个数组而不是简单类型的并发数组。毕竟,它不再是1960年了。