単純な正規表現を使用できます。パターン内の検索語を次のように組み合わせるだけ|
です。
var re = new Regex("geo|JCB",RegexOptions.IgnoreCase);
次に、説明の一致数を数えます。
Console.WriteLine(re.Matches(description).Count); // Outputs '5' in your example
あなたはこれによってあなたのリストを注文することができます:
searchResults.OrderByDescending(r => re.Matches(r).Count);
実例: http: //rextester.com/MMAT58077
編集:コメントにリンクされている新しい質問に従って(そして、うまくいけば、この質問の詳細を更新して重複を終了させます)、最も一般的な結果が結果のリストの早い段階で表示されるように結果を並べ替えます。
これを行うには、最初に各検索フレーズの関連する重みを計算し、これを使用して結果を並べ替えることができます。
ステップ1:データセット全体に各検索語が表示される合計回数をカウントして、均等化を計算します。
var wordsToFind = "Geo JCB".Split();
// find number of times each search phrase is found
var weights = wordsToFind.Select( w => new {
Word = w,
Weight = list.Where(x => x.Description.Contains(w)).Count()
} );
現時点でのこの質問のデータについては、次の結果が得られます。
GEO: 3
JCB: 2
したがって、最初にすべてのGEO
結果が必要であり、次にJCB
。GEO
最初の結果が最も頻繁に言及される結果になるのは良いことだと思います。
ステップ2:ステップ1で計算された重みを使用して、検索結果を並べ替えます。
var values = list.Select(x => new {
SearchResult = x,
Words = x.Description.Split(' ')
})
.Select(x => new {
SearchResult = x.SearchResult,
Weight = weights.Sum(w => x.Words.Contains(w.Word) ? w.Weight : 0)
})
.OrderByDescending(x => x.Weight)
.Select(x => x.SearchResult);
実例: http: //rextester.com/SLH38676