如何用LINQ查询包含数组任一值的项并绑定DataGridView
多关键词查询解决方案
问题根源
原代码报错是因为String.Contains()仅支持单个字符串参数,无法直接传入字符串数组,必须换用数组的Any()方法实现“任一关键词匹配”的逻辑。
修正后的完整代码
Private Sub filldgvData() Dim strSearch() As String = {"one", "two", "three"} Dim query = From item In rawdata Let itemText = item.Text Where strSearch.Any(Function(keyword) itemText.Contains(keyword)) Select item.index, item.LineNumber, item.StartTime, item.EndTime, item.Text Distinct Order By LineNumber Ascending dgvdata.DataSource = query.ToList() dgvdata.Columns(0).HeaderText = "Index" dgvdata.Columns(1).HeaderText = "Line" dgvdata.Columns(2).HeaderText = "Start Time" dgvdata.Columns(3).HeaderText = "End Time" dgvdata.Columns(4).HeaderText = "Text" End Sub
关键修改说明
- 匹配逻辑调整:用
strSearch.Any(Function(keyword) itemText.Contains(keyword))替代原错误写法,Any()会遍历关键词数组,只要当前项的Text包含数组中任意一个关键词,就会被筛选出来。 - 去重处理:添加
Distinct关键字,确保每个匹配项在结果中仅显示一次,避免同一项因匹配多个关键词重复出现。 - 笔误修正:原代码最后一列表头设置错误引用了
dgvSRT,已统一改为目标控件dgvdata。
可选:整词匹配优化
如果需要避免部分匹配(比如不想让"someone"被判定为包含"one"),可以使用正则表达式实现整词匹配,需先导入Imports System.Text.RegularExpressions,修改Where条件为:
Where strSearch.Any(Function(keyword) Regex.IsMatch(itemText, $"\b{Regex.Escape(keyword)}\b"))
内容的提问来源于stack exchange,提问作者James Parks
相关产品推荐
相关产品推荐

