假设我有以下内容
var searches = new ObservableCollection<Book>();
searches
包含书籍对象
public class Book
{
public string Title { get; set;}
public string Desc {get; set;}
}
我想排序searches
通过匹配的字符串。首先它检查Title
而不是根据搜索字符串与开头的接近程度对它们进行排名Title
。接下来它检查Desc
并根据搜索字符串与“描述”开头的距离有多近对它们进行排名。
例如,如果我有
Book 1
书名:ABC 书名
描述:第 1 本书的描述
Book 2
标题:仅书名
描述:第 2 本书的描述中有一个 ABC
Book 3
书名: 书名 ABC
描述:ABC在开头
假设搜索关键字是ABC
, 我想searches
进行排序,以便我得到以下内容。结果会优先考虑标题中包含搜索字符串的项目。
Book 1
书名:ABC 书名
描述:第 1 本书的描述
Book 3
书名: 书名 ABC
描述:ABC在开头
Book 2
标题:仅书名
描述:第 2 本书的描述中有一个 ABC
如何使用 LINQ 实现此目的?
您可以使用排名函数为每本书定义“分数”,然后按分数排序。
i.e.
var searchString = "ABC";
var results = books.Select(b => new { Book = b, Rank = RankBook(b, searchString) })
.OrderBy(r => r.Rank)
.Select(r => r.Book.Title);
以及排名函数:
private int RankBook(Book b, string searchString)
{
int rank = 0;
if (b.Title.Contains(searchString)) rank += 10;
if (b.Desc.Contains(searchString)) rank += 5;
return rank;
}
这就是说:在title中找到=10分,在desc中找到=5分,这样你就得到了最相关的、分数更高的书。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)