查找列表中包含最多关键字数的字符串

时间:2014-11-01 08:38:27

标签: c# string linq keyword

我对这个有点腌菜。

所以我所拥有的是关键字列表,例如:

this,
keyword,
apple,
car,
banana

我有一个字符串列表,我想找到的是那些关键字数量最多的字符串,我从.Any()开始,但这会返回第一个字符串,其中包含一个匹配关键字。

我的字符串列表:

This is a car. (2 keywords)
This is a sentence with the keyword apple, (3 keywords)
This sentence contains the keyword apple and another keyword car, (5 keywords)
The next sentence contains only car (1 keyword)

现在我要找的是第三句(5个,最多,关键字)。

这是一个比我头脑稍微高一点的算法,我也想在linq中思考,也许我应该以其他方式接近它

任何人都可以帮我这个吗?

由于

编辑:

好的,我可以使用MaxBy()方法。

现在我偶然发现了另一个问题,让我解释一下我在项目中做了些什么:

基本上我有种子列表

Torrent.Title
Torrent.Seeds

现在我在Torrent.Title上获得了MaxBy的结果,但这并没有考虑种子。我建议这样做:对max关键字进行某种排序,然后对种子进行排序。有人认为这是可能的吗?

这会有用吗?

var results = torrents.OrderByDescending(torrent => torrent.Title.Replace(".", " ").Replace("-", " ").Split().Count(Settings.FilterKeywords.Split(',').Contains)).ThenByDescending(torrent => torrent.Seeds);

return results.First();

2 个答案:

答案 0 :(得分:3)

使用MaxBy方法会更容易:

var keywords = new HashSet<string> { "this", "apple", "car", "keyword" };

var sentence = sentences.MaxBy(x => x.Split().Count(keywords.Contains));

不使用第三方库:

sentences
.Select(s => new { Sentence = s, Count = s.Split().Count(keywords.Contains) })
.OrderByDescending(x => x.Count).First().Sentence;

如果您想要不区分大小写的搜索,可以在ToLower之前使用Split

答案 1 :(得分:-2)

是的,我想我回答了自己的问题:

var results = torrents.OrderByDescending(torrent => torrent.Title.Replace(".", " ").Replace("-", " ").Split().Count(Settings.FilterKeywords.Split(',').Contains)).ThenByDescending(torrent => torrent.Seeds);

return results.First();

我要感谢大家的意见!