Linq搜索结果最接近的匹配

Bra*_*rap 6 c# linq search observablecollection windows-phone-7

我有一个ObservableCollection,它包含一个Person对象.我的应用程序中有一个搜索功能,并希望在顶部显示最相关的结果.这样做最有效的方法是什么?我当前的搜索方法只是调用contains方法:

 var results = (from s in userList
               where s.Name.Contains(query)
               select s).ToList();
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,但结果的排序顺序与它们出现的顺序相同userList.如果我搜索Pete,那么它应该先显示Pete,然后Peter再显示Peter Smith等等.它不必太复杂,因为它只会处理几千(最大)的结果.我天真的做法是先做s.Name == query,显示该项目(如果有的话),然后执行s.Name.Contains(query),删除匹配的项目并将其附加到先前的匹配结果.然而,这似乎有点遍布,所以有更好的方法吗?谢谢(ps - 在搜索时只使用名称,我不能使用SQL方法)

Ree*_*sey 10

您可以创建一个提供名称和查询字符串的例程,并返回一个整数值.

一旦你有了,只需通过以下方式返回:

int QueryOrder(string query, string name)
{
     if (name == query)
         return -1;
     if (name.Contains(query))
         return 0;

     return 1; 
}
Run Code Online (Sandbox Code Playgroud)

然后做:

var results = userList.OrderBy(s => QueryOrder(query, s.Name));
Run Code Online (Sandbox Code Playgroud)

这种方法的好处在于,稍后,您可以扩展例程以提供更多详细信息,从而可以根据您收到的匹配"好"进行排序.例如,"Pete" - >"Peter"可能是比"Pete" - >"Peter Smith"更好的匹配,所以你可以让你的逻辑为不同的选项返回不同的值......

如果您需要删除"非Pete"匹配,您也可以使用Where子句排除.


Jon*_*eet 7

你需要的是某种相似的评分函数.然后你可以这样做:

from s in userList
let score = Score(s, query)
where score > 80
orderby score descending
select s;
Run Code Online (Sandbox Code Playgroud)

(这假设一个评分函数,其值介于0-100之间,其中100是完美匹配.)

现在从你的例子中不清楚到底得分函数到底应该是什么 - 这是你的工作:)