0

私が達成しようとしていることの例として、 という文字列プロパティを使用して本のリストを作成するコードを次に示します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 つの単語がすべてのプロパティに表示されるわけではないため、ユーザーが何も検索フレーズを提供しない場合は返されます。

概要

  1. quick fox "lazy dog"- 1 つの結果 (引用符で囲まれた単語は一緒に表示され、残りの単語は個別に表示されます)

  2. quick fox sloth- 結果がありません

  3. "lazy sloth"- 1 つの結果 (両方の単語が文字列に一緒に表示されます)

  4. 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 つの一致を取得すると、アイテムが見つかったと見なされます。

4

2 に答える 2

1

All()LINQ メソッドが必要な場合があると思います。これを試してください。

var query = from b in books
            where (!string.IsNullOrEmpty(b.Sentence) && searchWords.All(word => b.Sentence.Contains(word)))
            select b;
于 2012-04-24T16:23:13.147 に答える
1

車輪を再発明する代わりに、Lucene.Netを使用します。ディスク上のインデックスさえ必要ありません。すべてのインデックス + 検索はメモリ内で実行できます (Lucene の RamDirectory を使用)

于 2012-04-24T16:34:34.013 に答える