我想搜索音乐乐器,其中包含我在my post中提到的信息名称,类别和来源。
但是现在我想通过相似性/相等性对结果进行排序/分组,例如。 如果我有列表
{Drum,Grand Piano,Guitar,Guitarrón,Harp,Piano}<<按名称排序
如果我查询“p”,结果应该是{Piano,Grand Piano,Harp} 但由于源列表的序列
,它首先显示了Harp如果我将{Grand Piano}添加到列表中并查询“钢琴”
结果应该像{Piano,Grand Piano}
或查询“吉他”
它应该是{Guitar,Guitarrón}
这是我的代码
static IEnumerable<MInstrument> InstrumentsSearch(IEnumerable<MInstrument> InstrumentsList, string query, MInstrument.Category[] SelectedCategories, MInstrument.Origin[] SelectedOrigins)
{
var result = InstrumentsList
.Where(item => SelectedCategories.Contains(item.category))
.Where(item => SelectedOrigins.Contains(item.origin))
.Where(item =>
{
if (
(" " + item.Name.ToLower()).Contains(" " + query.ToLower())
|| item.Name.IndexOf(query) != -1
)
{
return true;
}
return false;
}
)
.Take(30);
return result.ToList<MInstrument>();
}
或者结果可能就像my old self-invented algorithm我所说的“按顺序出现”,
那对我来说还不错。
进一步的事情是我需要搜索名称,类别或来源,例如。
如果我输入“意大利”,它应该找到意大利的钢琴或其他东西
或者,如果我输入“string”,它应该找到吉他。
有没有办法做这些事情,请告诉我。
提前致谢。
答案 0 :(得分:5)
您需要OrderBy
/ OrderByDescending
-
result = InstrumentsList.
.Where(...)
.OrderByDescending(instrument =>
StringSimilarityScore(instrument.Name, searchString))
.Take(30);
关于StringSimilarityScore的定义 - 全开模糊匹配最好,但您可以根据搜索字符串匹配的名称比例来量化匹配:
double StringSimilarityScore(string name, string searchString)
{
if (name.Contains(searchString))
{
return (double)searchString.Length / (double)name.Length;
}
return 0;
}
您可能想要考虑名称中搜索字符串的位置(更早更好),对于指定单个字母的情况 - 但我会将其留给您。 : - )