C# 用C语言对列表排序
如何以列表项匹配字符串的方式对列表进行排序。 如果我有C# 用C语言对列表排序,c#,.net,linq,C#,.net,Linq,如何以列表项匹配字符串的方式对列表进行排序。 如果我有 "vishal pandey" 在字符串中,匹配vishal pandey的列表项首先出现,然后它应该显示包含vishal的项和包含pandey的项的结果 我不可能从数据库中按那个顺序携带数据 目前我得到的名单是这样的 var matchedProjects = (from project in unitOfWork.ProjectRepository.All()
"vishal pandey"
在字符串中,匹配vishal pandey的列表项首先出现,然后它应该显示包含vishal的项和包含pandey的项的结果
我不可能从数据库中按那个顺序携带数据
目前我得到的名单是这样的
var matchedProjects = (from project in unitOfWork.ProjectRepository.All()
where project.IsActive
&& project is Project
&& (
queryList.Contains(project.Name)
|| project.Name.StartsWith(query)
|| project.Name.Contains(query)
|| project.Name.EndsWith(query)
|| project.ProjectAddress.City.Name.StartsWith(query)
|| project.ProjectAddress.City.Name.Contains(query)
|| project.ProjectAddress.City.Name.EndsWith(query)
|| queryList.Contains(project.ProjectAddress.City.Name)
|| queryList.Contains(project.ProjectAddress.Address1)
)
select project as Project).Distinct().AsParallel().ToList();
-谢谢我要做的就是创建一个。 然后创建一个实现此IComparer接口的类。 在构造函数中,可以传递所需字符串的列表。
在compare方法中,您可以根据项目的预期字符串数量比较两个实例。最简单但不是很有效的解决方案是对项目应用大量排序:
var keywords = "vishal pandey";
var items = new[] { "pandey", "other", "vishal", "vishal pandey" };
var query = items.OrderByDescending(i => i.Contains(keywords));
foreach (var keyword in keywords.Split())
query = query.ThenByDescending(i => i.Contains(keyword));
输出:
vishal pandey
vishal
pandey
other
但是,如果您有许多关键字,或者有很多项,自定义比较器将是更好的解决方案
更新1:如果部分匹配的顺序不重要,您可以使用Frank建议的简单解决方案:
var pattern = "vishal pandey".Replace(' ', '|');
var items = new[] { "pandey", "other", "vishal", "vishal pandey" };
var query = items.OrderByDescending(i => Regex.Matches(i, pattern).Count);
UPDATE2:自定义比较器示例
public class ItemsComparer : IComparer<string>
{
private string[] keywords;
private string pattern;
public ItemsComparer(string keywords)
{
this.keywords = keywords.Split();
this.pattern = keywords.Replace(' ', '|');
}
public int Compare(string x, string y)
{
var xMatches = Regex.Matches(x, pattern).Count;
var yMatches = Regex.Matches(y, pattern).Count;
if (xMatches != yMatches)
return yMatches.CompareTo(xMatches);
if (xMatches == keywords.Length || xMatches == 0)
return 0;
foreach (var keyword in keywords)
{
var result = y.Contains(keyword).CompareTo(x.Contains(keyword));
if (result == 0)
continue;
return result;
}
return 0;
}
}
你说的东西是什么样的?自定义对象的列表和列表?你想比较哪个领域?详细说明please@Franck不,这是ObjectModel的列表。您应该实现一个方法,该方法在接收查询的项目类中部分实现@Sergey solution,并检查所有需要的属性,并计算匹配项。然后,您只需执行一个var list of projectthatmatch=unitOfWork.ProjectRepository.All.ToList.where p=>p.GetMatchesQuantityvishal pandey>0.ToList,然后过滤掉该列表,您就可以再次使用匹配数量排序,或者您希望按最佳排序的任何其他内容将在拆分字符串输入时执行匹配计数,然后按most排序匹配项。@Franck同意,这也可以更好地对3个匹配项中的2个进行排序。匹配的唯一问题是部分匹配的顺序。例如,pandey将在vishal之前进行我的抽样是的,但我也认为顺序可能会变得很重要,因此通过匹配位置的评分系统可能对我有好处
var items = new[] { "pandey", "other", "vishal", "vishal pandey" };
var comparer = new ItemsComparer("vishal pandey");
Array.Sort(items, comparer);