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