【发布时间】:2016-03-28 04:52:00
【问题描述】:
我有 2 个数据表,每个数据表有 300,000 行(从 2 个带有 OLEDB 的 excel 工作表导入的数据表)。
第一个数据表是“dtTosearch”,第二个数据表是“sourceDt”。
这是 2 个表的示例:
我需要为“未标记”列 (sourceDt) 中的每一行找到与“令牌”列 (dtTosearch) 中每一行的匹配项。匹配条件为:
- “站点”值 =“站点”值
- 'cat' 值 = 'category' 值
- 未标记的值必须包含标记值
- 如果上述所有条件都存在多于一个匹配项,则查询必须返回具有最大长度的标记的匹配项。 (这是我不知道如何执行的棘手部分 linq)
- 这个任务必须在最短的处理时间内运行 - 因为它的要求,因为它更专业,而且因为我和朋友-同事-JAVA 热情的开发人员打赌,.NET 会运行得更快(就像白天一样 (-:)
我添加了代码的相关部分,它工作正常,但不是我想要的方式,我想缩短处理时间,查看 linqQuery() 函数中的 foreach 循环 - 如果你能帮助我,我将不胜感激通过将我的查询扩展到条件号 4 来替换该循环,该循环针对条件 4 运行,因为 linq 查询的结果按“令牌”长度按降序排列,因此它将退出并返回具有最大行长度的结果.
Private Sub startScanning()
Dim siteNum As Double
Dim categoryNum As Double
Dim stringToSearchin As String
For i = 0 To sourceDt.Rows.Count - 1
siteNum = sourceDt.Rows(i).Item(0)
categoryNum = sourceDt.Rows(i).Item(1)
stringToSearchin = sourceDt.Rows(i).Item(3)
Debug.WriteLine( linqQuery(siteNum, categoryNum, stringToSearchin) & " " &
stringToSearchin)
Next
End Sub
Private Function linqQuery(ByVal sitenum As Double, ByVal cat As Double,
ByVal stringToSearchIn As String) As String
Dim query = From row In dtTosearch
Where (row.Field(Of Double?)("site") = sitenum And
row.Field(Of Double?)("category") = cat)
Order By row.Field(Of String)("token").Length Descending
Select New With {
.token = row.Field(Of String)("token")
}
For Each x In query
If stringToSearchIn.Contains(x.token) Then
Return x.token
Exit Function
End If
Next
Return ""
End Function
非常感谢您的时间和考虑!
【问题讨论】:
-
嗨 @gnicolas 我也标记了 C#,因为如果示例是 C# 或 VB,它对我来说很重要
-
如果伪代码没问题:我想你需要在这里加入一个小组。您希望将 table1 中的每条记录与 table2 中的许多记录连接起来。
var joinedTables = from r1 in table1 join r2 in table2 on new {r1.site, r1.cat , r1.untagged.Contains(r2.token)} equals new {r2.site, r2.category, true} into possibleMatches select new {row1 = r1, row2 = possibleMatches.MaxBy(p => p.token.Length)}然后你有一个平面 ienumerable 你的加入记录。对不起,我在移动设备上的格式。 -
LINQ 连接将比 For 循环快得多。 For 循环变体导致将一个表的每一行与另一个表的每一行进行 O(m*n) 比较。另一方面,连接在内部使用哈希表,将成本降低到大约 O(n)。
-
tnx @gnicolas 我理解这个概念,对我来说 linq 的问题是我总是在语法上苦苦挣扎,我会尝试实现你的建议。