Как использовать LINQ для поиска совпадающих данных по списку строк - PullRequest
0 голосов
/ 23 июня 2010

У меня есть специализированный строковый словарь (строка, строка) (_RulesAndTheirDescription), который содержит имя (ключ) и описание (значение) методов в данном классе. В настоящее время я делаю следующий запрос, чтобы найти совпадение по ключу или значению, а затем связать его с сеткой. Работает отлично!

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", а также "this". Значение слова и фразы разделены пробелами. Очень похоже на Google и Bing. Когда пользователь вводит значение, я только потребую, чтобы фразы были заключены в кавычки. Следующий 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()}

Если я все делаю неправильно, пожалуйста, просветите меня. Похоже, это должно быть легко.

Спасибо заранее, Kevin

1 Ответ

0 голосов
/ 23 июня 2010

Здравствуйте. Для решения этой проблемы необходимо перекрестное соединение.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...