【问题标题】:How to sort linq result by most similarity/equality如何按大多数相似性/相等性对 linq 结果进行排序
【发布时间】:2010-04-16 21:59:52
【问题描述】:

我想搜索具有我在my post 中询问的名称、类别和来源信息的乐器。

但现在我想通过与关键字的相似性/相等性对结果进行排序/分组,例如。 如果我有清单

{ 鼓、三角钢琴、吉他、吉他、竖琴、钢琴}

如果我查询“p”,结果应该是 { Piano, Grand Piano, 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”,它应该会找到 Guitar。

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

提前致谢。

【问题讨论】:

  • 为什么是这个社区维基?不应该。
  • 对不起,我是新来的,我不知道社区 wiki 是什么,我可能不小心检查了它(我真的不知道它被检查了!)。现在我正在阅读社区是什么。对不起

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


【解决方案1】:

你想要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;
}

然后,对于指定单个字母的情况,您可能需要考虑搜索字符串在名称中的位置(越早越好),但我将由您决定。 :-)

【讨论】:

    猜你喜欢
    • 2016-04-21
    • 2012-01-28
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2020-09-03
    • 2014-05-24
    • 1970-01-01
    相关资源
    最近更新 更多