如何在VB.NET中从第二个DataTable向第一个执行查找匹配
在VB.NET中通过匹配Size字段为table1添加SizePriority列
完全可以通过Lookup相关逻辑实现需求,下面提供两种实用的实现方案,基于你给出的代码进行补充:
方案一:使用DataTable.Lookup方法(直接匹配)
DataTable.Lookup方法可直接按指定键值查找目标表的对应字段值,非常适配你的场景,步骤如下:
- 给table1添加
SizePriority列 - 遍历table1的每一行,通过Size字段匹配table2中的对应记录,获取SizePriority值并赋值
补充后的完整代码:
Private table1 As New DataTable Private table2 As New DataTable Protected Overrides Sub OnLoad(e As EventArgs) MyBase.OnLoad(e) ' 初始化table1 table1.Columns.AddRange({ New DataColumn("Column1", GetType(String)), New DataColumn("Column2", GetType(String)), New DataColumn("Column3", GetType(String)), New DataColumn("Size", GetType(String)), New DataColumn("Qty", GetType(Integer)) }) table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "5L", 25) table1.Rows.Add("TEST 2000", "TEST", "BHTF15", "S", 55) table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "M", 65) table1.Rows.Add("TEST 1000", "TEST", "BHTF25", "6L", 10) table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "S", 12) ' 初始化table2 createtabletwo() ' 添加SizePriority列到table1 table1.Columns.Add("SizePriority", GetType(Integer)) ' 遍历table1,匹配并赋值SizePriority For Each row As DataRow In table1.Rows Dim sizeValue As String = row("Size").ToString() ' 从table2中查找对应Size的SizePriority Dim priorityValues() As Object = table2.Lookup("Size", sizeValue, "SizePriority") If priorityValues.Length > 0 Then row("SizePriority") = priorityValues(0) Else ' 处理无匹配的情况(可选,比如赋值DBNull或默认值) row("SizePriority") = DBNull.Value End If Next DataGridView1.DataSource = table1 End Sub Private Sub createtabletwo() table2.Columns.AddRange({ New DataColumn("Size", GetType(String)), New DataColumn("SizePriority", GetType(Integer)) }) table2.Rows.Add("5L", 13) table2.Rows.Add("S", 2) table2.Rows.Add("M", 3) table2.Rows.Add("6L", 15) table2.Rows.Add("3L", 9) End Sub
方案二:使用LINQ查询(简洁高效)
通过LINQ将两个表按Size字段关联,直接生成包含SizePriority的结果集,代码风格更简洁:
' 在OnLoad方法中初始化两个表后,添加以下代码 Dim result = From t1 In table1.AsEnumerable() Join t2 In table2.AsEnumerable() On t1.Field(Of String)("Size") Equals t2.Field(Of String)("Size") Select New With { .Column1 = t1.Field(Of String)("Column1"), .Column2 = t1.Field(Of String)("Column2"), .Column3 = t1.Field(Of String)("Column3"), .Size = t1.Field(Of String)("Size"), .Qty = t1.Field(Of Integer)("Qty"), .SizePriority = t2.Field(Of Integer)("SizePriority") } ' 将LINQ结果转换为DataTable(如需绑定到DataGridView) Dim resultTable As DataTable = New DataTable() resultTable.Columns.Add("Column1", GetType(String)) resultTable.Columns.Add("Column2", GetType(String)) resultTable.Columns.Add("Column3", GetType(String)) resultTable.Columns.Add("Size", GetType(String)) resultTable.Columns.Add("Qty", GetType(Integer)) resultTable.Columns.Add("SizePriority", GetType(Integer)) For Each item In result resultTable.Rows.Add(item.Column1, item.Column2, item.Column3, item.Size, item.Qty, item.SizePriority) Next DataGridView1.DataSource = resultTable
最终期望结果
| Column1 | Column2 | Column3 | Size | Qty | SizePriority |
|---|---|---|---|---|---|
| TEST 3000 | TEST | BHTF10 | 5L | 25 | 13 |
| TEST 2000 | TEST | BHTF15 | S | 55 | 2 |
| TEST 3000 | TEST | BHTF10 | M | 65 | 3 |
| TEST 1000 | TEST | BHTF25 | 6L | 10 | 15 |
| TEST 3000 | TEST | BHTF10 | S | 12 | 2 |
内容的提问来源于stack exchange,提问作者roy
相关产品推荐
相关产品推荐

