排序以搜索词开头的搜索结果,然后是包含搜索词的结果



我有一个像这样的对象:

public class MyObject
{
public List<string> Names { get; set; }
// other props
} 

,我有一个像这样的过滤列表:

var freeText = "comm";
var list = new List<MyObject>(); // Initialized
var searchResult = list.Where(o =>
o.Names.Any(n => n.ToLower().StartsWith(freeText.ToLower())) ||
o.Names.Any(n => n.ToLower().Contains(freeText.ToLower())));

,它工作得很好,但是,我要做的是得到排序的搜索结果以first开头,然后by包含。

,

Obj 1 {Names : [ "free communication" ,"some name"]},
Obj 2 { Names : ["communcation Center", "whatever"]}

我想要的结果是[Obj2, Obj1]。

我试图订购freeText的索引,但它似乎不工作的数组/字符串列表。我试图在这个问题的解决方案,所以它的工作在数组而不是字符串,但它没有工作。知道怎么做吗?

您可以实现一个简单的评分机制,您将捕获两个标志(startsWithcontains),并使用这些标志进行过滤和排序:

var result = list.Select(item => new
{
item,
startsWith = item.Names.Any(n => n.ToLower().StartsWith(freeText.ToLower())),
contains = item.Names.Any(n => n.ToLower().Contains(freeText.ToLower())),
})
.Where(item => item.startsWith || item.contains)
.OrderByDescending(item => item.startsWith)
.ThenByDescending(item => item.contains)
.Select(x => x.item);

最新更新