当用户在搜索框中输入内容时,我正在使用实体框架从数据库中获取一些记录,并且需要在提取项目时对其进行排序。我将尝试通过以下方法简化问题。
说我有一个像下面这样的随机列表,我想根据子字符串的出现将其排序
var randomList = new List<string> { "corona", "corolla", "pecoroll", "copper", "capsicum", "because", "cobra" };
var searchText = "cor";
分类:
var sortedList = testList.OrderBy(x => x.IndexOf("cor"));
输出:
铜->辣椒->因为->眼镜蛇->电晕->花冠-> pecoroll
我知道代码可以按预期工作,因为列表按子字符串的索引排序,对于输出中的前4个项目,该索引为-1;对于第5个和第6个项目,为0;对于第7个项目,值为2。
问题:
我正在尝试按searchsString的索引进行排序,它是最接近的匹配项,以便为用户提供类似项目的建议。预期结果将是类似
花冠->电晕->佩克罗尔->眼镜蛇->铜->辣椒->因为
其中包含匹配的搜索文本的较低索引的项目将首先出现,并从搜索文本中以少1个字符的方式递归对列表进行排序,直到没有剩余字符。即,优先级赋予先后顺序为“ cor”,“ co”,“ c”的索引。我可能可以为此编写一个for循环或递归方法,但是考虑到我的代码从数据库中获取记录,因此应该考虑性能,是否有内置的LINQ方法在实现此目的的集合或库上实现此目标?谢谢您的帮助
要严格解决您的问题:“是否有内置的LINQ方法来实现这一目标?”,我相信答案是否定的。这种“最佳匹配”搜索是非常主观的。例如,可以说“眼镜蛇”比“ pecoroll”更好地匹配,因为用户更有可能在要求的“ r”之前错过了“ b”,而不是排除了前两个字母“ pe” “ pecoroll”一词。我认为,此行为的“适当”实现会考虑键接近度,常见的拼写错误以及许多其他指标,以最好地自动完成输入。可能会有一些已建立的库可用,而不是开发自己的方法。
但是,假设您确实想要您要求的确切行为,虽然听起来您很乐意自己做,但这是我的两分钱:
static List<string> SortedList(List<string> baseList, string searchString)
{
// Take a modifiable copy of the base list
List<string> sourceList = new List<string>(baseList);
// Sort it first alphabetically to resolve tie-breakers
sourceList.Sort();
// Create a instance of our list to be returned
List<string> resultList = new List<string>();
while(
// While there are still elements to be sorted
(resultList.Count != baseList.Count) &&
// And there are characters remaining to be searched for
(searchString.Length > 0))
{
// Order the list elements, that contain the full search string,
// by the index of that search string.
var sortedElements = from item in sourceList
where item.Contains(searchString)
orderby item.IndexOf(searchString)
select item;
// For each of the ordered elements, remove it from the source list
// and add it to the result
foreach(var sortedElement in sortedElements)
{
sourceList.Remove(sortedElement);
resultList.Add(sortedElement);
}
// Remove one character from the search to be used against remaining elements
searchString = searchString.Remove(searchString.Length - 1, 1);
}
return resultList;
}
测试:
var randomList = new List<string> { "corona", "corolla", "pecoroll", "copper", "capsicum", "because", "cobra" };
var searchText = "cor";
var sortedList = SortedList(randomList, searchText);
foreach(string entry in sortedList)
{
Console.Write(entry + ", ");
}
我得到:
corolla, corona, pecoroll, cobra, copper, capsicum, because,
我希望这有帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句