anu*_*ith 2 c# linq search linq-to-objects
我想搜索音乐乐器,其中包含我在帖子中提到的信息名称,类别和原点.
但是现在我想通过相似性/相等性对结果进行排序/分组,例如.如果我有清单
{Drum,Grand Piano,Guitar,Guitarrón,Harp,Piano} <<按名称排序
如果我查询"p",结果应该是{Piano,Grand Piano,Harp}
但是由于源列表的顺序,它首先显示了Harp
如果我将{Grand Piano}添加到列表并查询"钢琴"
,结果应该像{Piano,Grand Piano}
或查询"guitar"它应该是{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>();
}
Run Code Online (Sandbox Code Playgroud)
或者结果可能就像我自己发明的旧算法,我称之为"按顺序出现",
这对我来说还可以.
而进一步的事情是我需要搜索名称,类别或原点,如.
如果我输入"意大利",它应该找到来自意大利的钢琴或其他东西.
或者,如果我键入"string",它应该找到吉他.
有没有办法做那些事情,请告诉我.
提前致谢.
你想要OrderBy/ OrderByDescending-
result = InstrumentsList.
.Where(...)
.OrderByDescending(instrument =>
StringSimilarityScore(instrument.Name, searchString))
.Take(30);
Run Code Online (Sandbox Code Playgroud)
至于StringSimilarityScore的定义 - 全开模糊匹配最好,但您可以根据搜索字符串匹配的名称比例来量化匹配:
double StringSimilarityScore(string name, string searchString)
{
if (name.Contains(searchString))
{
return (double)searchString.Length / (double)name.Length;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后,您可能想要考虑名称中搜索字符串的位置(更早更好),对于指定单个字母的情况 - 但我会将其留给您.:-)
| 归档时间: |
|
| 查看次数: |
1276 次 |
| 最近记录: |