gpt4 book ai didi

c# - 我如何简化这个在字符串中搜索关键字并按相关性排序的 LINQ 查询?

转载 作者:太空宇宙 更新时间:2023-11-03 22:43:59 25 4
gpt4 key购买 nike

假设我有一些 MyObject,每个对象都有一个 Description 属性。我有一个关键字列表,我想用它来搜索 MyObject 列表。我想按每个 Description 包含的关键字数量降序排列它们。

示例输入(仅显示 Description 属性,注意初始顺序):

"Foo Bar"
"Foo Boo"
"Bar Bar"

示例关键字:

"Boo", "Foo"

示例输出(仅显示 Description 属性,注意最终顺序):

"Foo Boo" (matches 2 keywords)
"Foo Bar" (matches 1 keyword)

“Bar” “Bar”不在结果中,因为它匹配 0 个关键字。

我目前正在使用这个非常复杂的方法链:

return keywords.SelectMany(
x => MyObjects.Where(y => y.Description.ToLowerInvariant().Contains(x.ToLowerInvariant()))
)
.GroupBy(x => x)
.OrderByDescending(x => x.Count())
.Select(x => x.Key).ToList();

如您所见,我首先选择关键字。我认为作为代码的读者,您会希望首先看到对 MyObjects 进行的一些转换。通常,当我编写 LINQ 时,我会尝试在脑海中想象操作的样子。看到正在转换的关键字感觉有悖常理。我也不喜欢 SelectMany 中的嵌套查询,因为它使查询语法看起来很丑陋:

var query = from keyword in keywords
from matchedObjects in (from obj in MyObjects where obj.Description.ToLowerInvariant().Contains(keyword.ToLowerInvariant()) select obj)
group matchedObjects by matchedObjects into sameObjects
orderby sameObjects.Count() descending
select sameObjects.Key;
return query.ToList();

如何改进 LINQ 查询?理想情况下:

  • 没有嵌套查询
  • MyObjects.SomeLINQOperation... 而不是 keywords 开头。

我希望有一种更简单/更直观的方法,因为这似乎是一件微不足道的事情,但我也承认,如果提供解释,没有更简单的方法。

最佳答案

results = myObjects.OrderByDescending(myObject => keywords.Where(keyword => myObject.Description.Contains(keyword)).Count());

给你你需要的?

编辑:

var temp = myObjects.Where(myObject => keywords.Any(keyword => myObject.Description.Contains(keyword)))
.OrderByDescending(myObject => keywords.Where(keyword => myObject.Description.Contains(keyword)).Count());

不确定这算不算“更好”。

关于c# - 我如何简化这个在字符串中搜索关键字并按相关性排序的 LINQ 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50856344/

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