如何通过最相似/相等来对linq结果进行排序

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",它应该找到吉他.

有没有办法做那些事情,请告诉我.

提前致谢.

Ben*_*n M 5

你想要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)

然后,您可能想要考虑名称中搜索字符串的位置(更早更好),对于指定单个字母的情况 - 但我会将其留给您.:-)