0

私はクラス WebItem を持っています:

class WebItem
{
   public string Name { get; set; }
   public string Description { get; set; }
   public string Keywords { get; set; }
}

ユーザーが検索フレーズを入力すると、プログラムは検索フレーズのすべての用語が存在するすべてのアイテムを検索する必要があります。元ユーザーがフレーズ「some text」を入力します。プログラムはアイテムを見つける必要があります。

  • (名前に「some」が含まれ、説明に「text」が含まれる) または
  • (名前には「テキスト」が含まれ、説明には「一部」が含まれます) または
  • (名前に「some」が含まれ、キーワードに「text」が含まれる) または
  • (名前に「text」が含まれ、キーワードに「some」が含まれる) または
  • (説明に「some」が含まれ、キーワードに「text」が含まれる) または
  • (説明に「テキスト」が含まれ、キーワードに「一部」が含まれる) または
  • (名前に「text」が含まれ、名前に「some」が含まれる) または
  • (説明に「テキスト」が含まれ、説明に「一部」が含まれる) または
  • (キーワードには「テキスト」が含まれ、キーワードには「一部」が含まれます)

ユーザーは、さまざまな長さのフレーズを入力できます。どうやってするか?

4

3 に答える 3

3

完全な解決策を提供するつもりはありませんが、次のことを行う必要があるようです。

  • ユーザーの入力を単語に分割する
  • すべての単語が何らかの形でアイテムに含まれているかどうかを確認します。ここでは LINQAllメソッドが役に立ちます。単一の単語がアイテムのどこに表示されるかを確認する方法を考え出すだけでよく、それを使用Allして、特定のクエリのすべての検索語に適用できます。

あなたはあなたの構造を変えたいと思うかもしれませWebItemん。これらのプロパティのそれぞれに複数の単語を含めることができる場合は、おそらくそれらを分割したいと思うでしょう... そうしないと、一致に関して注意が必要になります。たとえば、ユーザーが検索語として「am」と入力した場合、おそらく「名前」の説明と何かを一致させたくはありませんが、「私はここにいます」という説明と何かを一致さたいとします。 . 次に、ステミングなどの問題があります...

(余談ですが、とにかく一致する可能性のある用語を分割する場合は、一致の目的だけで単一HashSet<string>の for each を作成できます。)WebItem

この種のことのために設計されたサードパーティの API を使用することについての Marc のポイントは、良いものです。

于 2013-01-17T07:49:26.513 に答える
0

これを試して。

 var lst = new List<WebItem>();
        string searchString = "your text";
        string[] searchArr = searchString.Split(" ".ToCharArray());
        lst.Where((l) => searchArr.Count((s) => l.Name.Contains(s)) > 0
                         || searchArr.Count((s) => l.Keywords.Contains(s)) > 0
                         || searchArr.Count((s) => l.Description.Contains(s)) > 0);
于 2013-01-17T08:00:12.223 に答える
0

ありがとう、マーク。

解決策は非常に簡単です。

 //term - search phrase
 var terms = term.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);

 //searching list.
 var searchList = some_data_list_from_somethere_where_we_are_searching.AsEnumerable();

 foreach (var item in terms)
 {
     searchList = searchList.Where(q => q.Name.Contains(item) || 
                                        q.Keywords.Contains(item) || 
                                        q.Description.Contains(item));
 }
于 2013-01-17T15:02:39.240 に答える