3

问题很简单......
鉴于:

-> 脏话列表,比如 List1。
-> 一个字符串(或短语)列表来搜索这些脏话,比如 List2

期望的输出:与至少一个脏话匹配的短语计数。

示例:
List1 : "cat", "dog", "mouse", "Nice animal"
List2 : "A cat is good"。“狗是坏的”、“猫和狗是好的”、“好动物”、“你好”、“你好老鼠”、“这很糟糕”

输出:5 个短语至少包含 1 个脏词。

我做了什么:

int sum = list1.Sum(s => list2.Count(t => t.Contains(s)));

这需要大约 38 秒来搜索 5600 个短语和大约 4000 个字符串。(四核,4 GB RAM)... WAYYYYYY 太慢了!

我四处寻找可能存在的解决方案或算法......找不到任何东西。

即使有人可以通过命名算法、显示代码片段或只是指指点点 (!!) 来为我指明正确的方向,那也很棒!

4

1 回答 1

3

这应该更有效,因为Any尽快休息:

int contains = phrases.Count(p => foulWords.Any(fw => p.Contains(fw)));

您的方法也不是最佳的,因为您的起点是List1( foulWords) 所以您需要每个计数的总和,这是低效的。正确的结果必须介于 0(没有匹配的脏词)和phrases.Count(所有短语都包含脏词)之间。所以起点应该是phrases

演示

问:你能帮我修改上面的代码,让我也给我列表中短语的索引吗?

是的:

var wordIndexes = phrases.Select((phrase, index) => new { phrase, index })
    .Where(x => foulWords.Any(fw => x.phrase.Contains(fw)));

foreach (var wordIndex in wordIndexes)
    Console.WriteLine("Word: {0} Index: {1}", wordIndex.phrase, wordIndex.index);

结果:

Word: A cat is good        Index: 0
Word: a dog is bad         Index: 1
Word: cat and dog are good Index: 2
Word: Nice animal          Index: 3
Word: Hello mouse          Index: 5
于 2013-05-08T07:49:29.133 回答