私が達成しようとしていることの例として、 という文字列プロパティを使用して本のリストを作成するコードを次に示します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"
book1 をコレクションのメンバーとして持つリストを返しました。quick fox sloth
これらの 3 つの単語がすべてのプロパティに表示されるわけではないため、ユーザーが何も検索フレーズを提供しない場合は返されます。
概要
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 つの一致を取得すると、アイテムが見つかったと見なされます。