【问题标题】:How To Use LINQ To Find Matching Data Against A List Of Strings如何使用 LINQ 查找与字符串列表匹配的数据
【发布时间】:2010-06-22 20:10:41
【问题描述】:

我有一个专门的 (string, string) (_RulesAndTheirDescriptions) 字符串字典,其中包含给定类中方法的名称(键)和描述(值)。我目前执行以下查询来搜索键或值的匹配项,然后将其绑定到网格。效果很好!

Dim Results = From v In _RulesAndTheirDescriptions _
 Where v.Value.ToString().ToUpper().Contains(Me.txtSearchFor.Text.ToUpper()) _
 Or v.Key.ToString().ToUpper().Contains(Me.txtSearchFor.Text.ToUpper()) _
 Order By v.Key _
 Select New With {.Rule = v.Key, .Description = v.Value.ToString()}

这在匹配“word”甚至“my word”时效果很好,但我想搜索“my”和“word”以及“also this”。意思是用空格分隔的单词和短语。很像谷歌和必应。当用户输入一个值时,我只需要引用这些短语。以下 RegEx 负责为我提供用户正在寻找的列表单词/短语。现在我很难将上述查询与新的增强列表结合起来。

请原谅下面的代码。我只是想测试一些东西并让它发挥作用。

Dim b As Match
b = Regex.Match(Me.txtSearchFor.Text, "(?<=(?:^|\s|,)"")[^""]*?(?="")|(?<=\s|^)(?!"")[\w\W]+?(?=\s|$)")

Dim sl As List(Of String) = New List(Of String)

If b.Success Then
    sl.Add(b.Value.ToUpper())

    Dim sMatch = b.NextMatch()

    While sMatch IsNot Nothing AndAlso sMatch.Success
        sl.Add(sMatch.Value.ToUpper())
        sMatch = sMatch.NextMatch()
    End While
End If

根据本网站上的另一篇文章,我尝试执行以下操作,但这并没有返回任何结果。我怀疑是因为 sl.ToString() 返回的是类型而不是值?

Dim Results = From v In _RulesAndTheirDescriptions _
 Where v.Value.ToString().ToUpper().Contains(sl.ToString()) _
 Order By v.Key _
 Select New With {.Rule = v.Key, .Description = v.Value.ToString()}

如果我说这一切都错了,请赐教。似乎应该很容易。

提前致谢, 凯文

【问题讨论】:

    标签: vb.net regex linq list


    【解决方案1】:

    你好,你必须有一个交叉连接才能解决这个问题

    Dim Results = From v In _RulesAndTheirDescriptions _
    join y in  sl on 1 equals 1 
     Where v.Value.ToString().ToUpper().Contains(y) _
     Order By v.Key _
     Select New With {.Rule = v.Key, .Description = v.Value.ToString()}
    

    当多个令牌可以匹配规则时,这可能会产生重复。因此,如果您想要唯一的值,您可以执行不同的操作

    Like  Results.Distinct()
    

    【讨论】:

    • 听起来它可能有效,但第二行:join y in sl on 1 equals 1 给我以下错误:您必须在“等于”的两侧引用至少一个范围变量操作员。范围变量“v”必须出现在“等于”运算符的一侧,范围变量“y”必须出现在另一侧。
    • Bot 它对我来说没问题 - 我使用的是 .NET 3.5。例如以下作品类 Program { static void Main(string[] args) { List x = new List() { "AA", "BB", "CC" };列表 y = 新列表() { 1, 2, 3 }; var z=from a in x join b in y on 1 等于 1 select new{X=a,Y=b}; foreach (var u in z) Console.WriteLine("{0} {1} ", u.X, u.Y); } 给出 AA 1 AA 2 AA 3 BB 1 BB 2 BB 3 CC 1 CC 2 CC 3 }
    • OK 即使您的版本坚持任何一方的“正确”值,您也可以通过使用等于双方相同值的东西来克服这个问题 ex GetType() 如下 var z=from a in x join b in y on a.GetType() 等于 b.GetType() select new{X=a,Y=b};
    • 感谢您的努力和启迪。我非常感谢它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多