作为我正在尝试完成的一个示例,这里有一些代码,它构建了一个带有名为的字符串属性的书籍列表Sentence
。
public class Book {
public string Sentence { get; set; }
}
Book book1 = new Book() { Sentence = "The quick brown fox jumps over the lazy dog" };
Book book2 = new Book() { Sentence = "The quick brown frog jumps over the lazy sloth" };
List<Book> books = new List<Book>();
books.Add(book1);
books.Add(book2);
我想根据一些用户输入搜索书籍列表(搜索要求不应该比这个例子更复杂)。
如果用户提供了 的搜索短语quick fox "lazy dog"
,那么我会返回一个 List,其中 book1 作为集合的成员。如果用户提供的搜索词组quick fox sloth
不应该返回,因为这三个词不会全部出现在任何属性中。
概括
quick fox "lazy dog"
- 1 个结果(引号中的单词一起出现,其余单词单独出现)quick fox sloth
- 没结果"lazy sloth"
- 1 个结果(两个词一起出现在字符串中)lazy sloth
- 1 个结果(两个单词都出现在字符串中)
我目前拥有的代码:
//Turn the search word into an array of words (includes support for quotes phrases). E.g: quick fox "lazy dog" becomes a list of these values: `quick`, `fox`, `lazy dog`.
var searchWords = Regex.Matches(searchWord, @"(?<match>\w+)|\""(?<match>[\w\s]*)""")
.Cast<Match>()
.Select(m => m.Groups["match"].Value)
.ToList();
var query = from b in books
where (!string.IsNullOrEmpty(b.Sentence) && searchWords.Any(b.Sentence.Contains))
select b;
这不适用于案例 2。我现在拥有的代码只是在寻找 1 个匹配项,如果它得到 1 个匹配项,那么它认为找到的项目。