Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 引发运行时错误的字符串排序和搜索列表_Vb.net_List_Sorting_Search - Fatal编程技术网

Vb.net 引发运行时错误的字符串排序和搜索列表

Vb.net 引发运行时错误的字符串排序和搜索列表,vb.net,list,sorting,search,Vb.net,List,Sorting,Search,我在VB.NET中使用列表。我想按键/唯一字段(FEIN)对列表进行“排序”,但得到一个错误。我创建了一个包含三列的列表(FEIN、Status、Term\u Date)。这张单子很好。此外,我想以一种快速有效的方式“搜索”这个列表(BinarySearch?)。我尝试使用FindIndex,但速度非常慢。我意识到我的排序/搜索语法假定为一个单列列表,但我正在尝试将其用于多列列表。我在代码后面附加了注释和错误。我在Visual Studio 2019 VB.NET中工作 '定义列表中的列 Pub

我在VB.NET中使用列表。我想按键/唯一字段(FEIN)对列表进行“排序”,但得到一个错误。我创建了一个包含三列的列表(FEIN、Status、Term\u Date)。这张单子很好。此外,我想以一种快速有效的方式“搜索”这个列表(BinarySearch?)。我尝试使用FindIndex,但速度非常慢。我意识到我的排序/搜索语法假定为一个单列列表,但我正在尝试将其用于多列列表。我在代码后面附加了注释和错误。我在Visual Studio 2019 VB.NET中工作

'定义列表中的列

Public Class AddInfo
    'custom class additional info
    Public Property FEIN As String
    Public Property Status As String
    Public Property Term_Date As String

    Public Sub New(ByVal FEIN As String,
                    ByVal Status As String,
                    ByVal Term_Date As String)

        Me.FEIN = FEIN
        Me.Status = Status
        Me.Term_Date = Term_Date
    End Sub
End Class
'从源数据表(dtAddInfo)填充列表(3列),此列表填充得很好

Dim lstAddInfo = New List(Of AddInfo)
For Each r As DataRow In dtAddInfo.Rows
    lstAddInfo.Add(New AddInfo(r("FEIN"), r("Status"), r("Term_Date")))
Next
'按FEIN对新填充的列表进行排序

lstAddInfo.Sort()  'this throws "Failed to compare two elements in the array."
'使用FEIN查找列表中的索引/行

Dim index = lstAddInfo.BinarySearch("123"))  'this throws "Unable to cast object of type 'System.String' to type"
'注意:我尝试使用以下内容而不是BinarySearch。它可以工作,但速度非常慢(列表包含220K行)


不幸的是,我无法减少源数据库表中的行数。但是…我找到了另一个选择。我使用LINQ查询连接两个数据表(Excel和AddInfo),以基于FEIN创建一个新的精简目标数据表。这似乎大大加快了速度。我附上了构建联接数据表的代码。再次感谢

    'use LINQ query to join Excel and Add Info datatables on FEIN
    Dim joinedResults =
            From Excl In dt_Excel.AsEnumerable()
            Join AddInfo In dt_Add_Info.AsEnumerable()
            On Excl.Field(Of String)("FEIN") Equals AddInfo.Field(Of String)("FEIN")
            Select
            FEIN = Excl.Field(Of String)("FEIN"),
            Status = AddInfo.Field(Of String)("Status"),
            Term_Date = AddInfo.Field(Of String)("Term_Date")

    'define target datatable
    dt_Add_Info = New DataTable
    dt_Add_Info.Columns.Add("FEIN", GetType(String))
    dt_Add_Info.Columns.Add("Status", GetType(String))
    dt_Add_Info.Columns.Add("Term_Date", GetType(String))

    'populate target datatable
    For Each row In joinedResults
        Dim dr As DataRow = dt_Add_Info.NewRow()
        dr("FEIN") = row.FEIN
        dr("Status") = row.Status
        dr("Term_Date") = row.Term_Date
        dt_Add_Info.Rows.Add(dr)
    Next

对于第一个错误:
lstAddInfo.Sort()无法比较>数组中的两个元素。
您需要实现
AddInfo
类。考虑到这三列数据,
AddInfo
的实例应该如何排序?您应该阅读以了解排序在.NET中的工作原理。这里有三个部分,所以一定要把这三个部分都读一遍。谢谢你。您提供的IComparable链接非常有用。我的列表排序正确(按FEIN升序,第一列)。但是…我仍然面临着以高效/快速的方式搜索已排序列表的问题。我尝试了各种二进制搜索方法,但似乎没有任何效果。我不确定,但似乎多列列表是问题所在。“列表包含220K行”您能减少被提取的记录数吗?您可以改为查询数据表吗?您可以改为查询数据表的源吗?
    'use LINQ query to join Excel and Add Info datatables on FEIN
    Dim joinedResults =
            From Excl In dt_Excel.AsEnumerable()
            Join AddInfo In dt_Add_Info.AsEnumerable()
            On Excl.Field(Of String)("FEIN") Equals AddInfo.Field(Of String)("FEIN")
            Select
            FEIN = Excl.Field(Of String)("FEIN"),
            Status = AddInfo.Field(Of String)("Status"),
            Term_Date = AddInfo.Field(Of String)("Term_Date")

    'define target datatable
    dt_Add_Info = New DataTable
    dt_Add_Info.Columns.Add("FEIN", GetType(String))
    dt_Add_Info.Columns.Add("Status", GetType(String))
    dt_Add_Info.Columns.Add("Term_Date", GetType(String))

    'populate target datatable
    For Each row In joinedResults
        Dim dr As DataRow = dt_Add_Info.NewRow()
        dr("FEIN") = row.FEIN
        dr("Status") = row.Status
        dr("Term_Date") = row.Term_Date
        dt_Add_Info.Rows.Add(dr)
    Next