您可以使用简单的正则表达式,只需将模式中的搜索词与|
:
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
编辑:根据您在评论中链接的新问题(希望您更新此问题的详细信息并让重复项消失)您希望对结果进行排序,以便最常见的结果显示在结果列表的前面.
为此,您可以首先计算每个搜索短语的相关权重,并使用它对结果进行排序。
Step1:通过统计每个搜索词在整个数据集中出现的总次数来计算权重:
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