gpt4 book ai didi

c# - 如何按最相似性/相等性对linq结果进行排序

转载 作者:行者123 更新时间:2023-12-04 02:23:54 24 4
gpt4 key购买 nike

我想搜索具有名称、类别和来源信息的乐器,正如我在 my post 中所要求的那样.

但现在我想根据关键字的相似性/相等性对结果进行排序/分组,例如。如果我有 list

{ Drum, Grand Piano, Guitar, Guitarrón, Harp, Piano} << 按名称排序

如果我查询“p”,结果应该是 { Piano, Grand Piano, Harp }
但由于源列表的顺序,它首先显示 Harp

如果我将 {Grand Piano} 添加到列表中并查询“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我称之为“按发生顺序”,
这对我来说没问题。

接下来要做的是我需要搜索名称、类别或来源,例如。
如果我输入“Italy”,它应该会找到 Piano 或来自意大利的东西。
或者,如果我输入“string”,它应该会找到 Guitar。

有什么办法可以做到这些,请告诉我。

提前致谢。

最佳答案

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

对于指定单个字母的情况,您可能需要考虑搜索字符串在名称中的位置(越早越好)——但我会把它留给您。 :-)

关于c# - 如何按最相似性/相等性对linq结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2649477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com