现在已经有几天了,试图找出最有效的方法来搜索一个列表,列表中有数千个没有特定顺序的多个关键字。我在其他屏幕上实现了简单的搜索,但是这个有点棘手。让我解释一下。
所以让我们说我的清单如下所示
如果我在搜索框中输入关键词"man",我希望看到3次点击,这是很容易完成的。然而,如果我键入部分关键字,如" ma“或”ma a“,我希望只看到”愤怒管理“。如果有一个以上的命中,那么我应该能够缩小它通过键入更多的词或简单地完成我的关键字,我在搜索框。
现在,我有了一些实现,但由于正在执行的迭代次数,我对此并不太满意。我担心,当我们有更多的数据,这个搜索将无法有效地执行,将是缓慢的。
public List<ValidAndCompletedModel> Filter(List<string> searchTerms)
{
var validAndCompleted = new List<ValidAndCompletedModel>();
foreach (var searchTerm in searchTerms)
{
var containingList = ValidAndCompleted.Where(d => ListsContainsSimilarEntry(searchTerm, d.EnglishTranslationTerms)).ToList();
containingList = containingList.Distinct().ToList();
validAndCompleted.AddRange(containingList.Where(d => ListsStartsWithSimilarEntry(searchTerm, d.EnglishTranslationTerms)).ToList());
}
validAndCompleted = validAndCompleted.Distinct().ToList();
return validAndCompleted;
}
private bool ListsStartsWithSimilarEntry(string searchTerm, IEnumerable<string> searchList)
{
var available = searchList.Any(sl => sl.StartsWith(searchTerm));
return available;
}
private bool ListsContainsSimilarEntry(string searchTerm, IEnumerable<string> searchList)
{
var available = searchList.Any(sl => sl.Contains(searchTerm));
return available;
}非常感谢你的帮助。
发布于 2014-06-03 00:32:44
除非您的列表中有数以百万计的项目,否则性能不太可能成为问题。在尝试优化之前,您应该始终衡量实际使用性能。
在任何情况下,代码都可以简化如下:
public List<ValidAndCompletedModel> Filter(List<string> searchTerms)
{
return (
from searchTerm in searchTerms
from d in ValidAndCompleted
where d.EnglishTranslationTerms.Any(sl => sl.Contains(searchTerm))
where d.EnglishTranslationTerms.Any(sl => sl.StartsWith(searchTerm))
select d)
.Distinct()
.ToList();
}这似乎不算太糟。唯一突出的是,您只返回“包含”和“以”翻译术语开头的项,但这意味着您只返回“以”开头的项,而忽略了任何“包含”项。这可能需要重新考虑。
现在,您可以进一步简化代码,如下所示:
public List<ValidAndCompletedModel> Filter(List<string> searchTerms)
{
return (
from searchTerm in searchTerms
from d in ValidAndCompleted
from sl in d.EnglishTranslationTerms
where sl.StartsWith(searchTerm)
select d)
.Distinct()
.ToList();
}或者,通过这样做,可以完全避免.Distinct()调用(假设ValidAndCompleted列表中没有重复调用):
public List<ValidAndCompletedModel> Filter2(List<string> searchTerms)
{
return ValidAndCompleted
.Where(d => (
from searchTerm in searchTerms
from sl in d.EnglishTranslationTerms
where sl.StartsWith(searchTerm)
select d).Any())
.ToList();
}发布于 2014-06-03 00:44:15
使用您的电影和类别的例子。假设我们有这样一门课:
public class Category
{
public string Name {get; set;}
public List<string> Films {get; set;}
}我们的电影是这样的:
var filmCategories = new List<Category>
{
new Category { Name = "Martial Arts", Films = new List<string>
{ "Game Of Death", "IP Man", "The Protector" }},
new Category { Name = "Comedy", Films = new List<string>
{ "Ride Along", "Police Academy", "Anchorman", "Anger Management" }},
new Category { Name = "Action", Films = new List<string>
{ "Blood And Bone", "The Matrix", "Captain America", "The Terminator" }}
}; 我们的搜索术语如下:
var searchTerm = "g d";
var searchTerms = searchTerm.ToLower().Split(' ');你可以在这样的一张照片中得到你的搜索结果:
var results = filmCategories
.SelectMany(category => category.Films)
.Where(film =>
searchTerms.All(term =>
film.ToLower().Split(' ')
.Any(word =>
word.StartsWith(term))));https://stackoverflow.com/questions/24005036
复制相似问题