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

时间:2010-04-15 22:40:43

标签: c# linq search linq-to-objects

我想搜索音乐乐器,其中包含我在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”,它应该找到吉他。

有没有办法做这些事情,请告诉我。

提前致谢。

1 个答案:

答案 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;
}

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