我有一个像这样的对象:
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的索引,但它似乎不工作的数组/字符串列表。我试图在这个问题的解决方案,所以它的工作在数组而不是字符串,但它没有工作。知道怎么做吗?
您可以实现一个简单的评分机制,您将捕获两个标志(startsWith
和contains
),并使用这些标志进行过滤和排序:
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);