Arrays Vb.Net排序3x一维数组

Arrays Vb.Net排序3x一维数组,arrays,vb.net,sorting,icomparable,Arrays,Vb.net,Sorting,Icomparable,我有3个一维数组。 每个包含与其他2个数组相对应的信息。 e、 g数组1包含客户的名字 数组2包含客户姓氏 数组3包含客户电话号码 这不是我的实际例子,但最容易解释。 我如何对这三个数组进行排序,以便它们按照客户姓氏的顺序进行排序。 如果史密斯先生被排序,并且在lastname数组中从第10位移动到第5位,我希望他的电话号码和名字也在相应数组中的第5位 我正在处理10000个项目的数组,所以我希望避免循环(我当前的方法),因为这是难以置信的慢 希望使用array.sort方法 有人能帮我吗 好的

我有3个一维数组。 每个包含与其他2个数组相对应的信息。 e、 g数组1包含客户的名字 数组2包含客户姓氏 数组3包含客户电话号码

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

我正在处理10000个项目的数组,所以我希望避免循环(我当前的方法),因为这是难以置信的慢

希望使用array.sort方法

有人能帮我吗

好的-所以我试着使用一种新的数据类型,但是我仍然不知道如何使用它来即时过滤。下面是我的示例代码,其中有几个问题。如果有人能解决这个问题,他会很想知道你是如何解决的

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


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

不过,要回答您的问题,没有办法同时对三个数组进行排序,但有办法对两个数组进行排序。这意味着,您可以创建要用作键的数组的副本,然后使用副本对其他数组中的一个进行排序,使用原始数组对另一个进行排序。查看数组的文档。将两个数组作为参数的复制重载


这就是说,复制数组然后进行两次排序是一项巨大的开销,因此您可能不会从这种方法中获得太多(如果有的话)。最好首先以正确的方式执行,即使用复杂类型的单个数组,而不是简单类型的并发数组。毕竟已经不是1960年了。

为什么还要使用阵列?为什么不是类型?或者类。Dim Smith作为新人,Smith.Phone=#,Smith.Address=#等等。?我知道得到的回答不能回答你的问题很糟糕,但3个相关数组很奇怪。还有,为什么不是2d数组或表格呢?谢谢大家的评论。你必须原谅我对VBA的知识有限。我以前从未使用过类型。使用数组的目的是,我可以使用array.methods快速检查一个数组中是否存在某个项,以及是否存在该项,并更新另一个数组中相应的项。我可以用打字机吗?我希望避免在数千个项目中循环检查数据集中是否存在项目。请参阅我的调整后问题。即使使用类型,我如何在不循环的情况下过滤或查找记录?+1不知道您也在,John:)
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