问题很简单......
鉴于:
- > List1中的一系列犯规词。
- >用于搜索这些犯规词的字符串(或短语)列表,比如List2
期望的输出: 与至少一个犯规词相匹配的短语计数。
样品:
List1 :“猫”,“狗”,“老鼠”,“好动物”
List2 :“猫是好的”。 “狗是坏的”,“猫和狗都很好”,“好动物”,“你好”,“你好老鼠”,“这是坏事”
输出: 5个短语包含至少1个犯规词。
我做了什么:
int sum = list1.Sum(s => list2.Count(t => t.Contains(s)));
对于一个5600个短语的粗体字列表大约需要38秒,并且要搜索大约4000个字符串。(四核,4 GB RAM)... WAYYYYYY太慢了!
我已经四处寻找可能存在的解决方案或算法......找不到任何解决方案或算法。
即使有人能指出我正确的方向,通过命名一个算法,显示一个代码片段,或只是指着一根手指(!!),这将是伟大的!
答案 0 :(得分:3)
这应该更有效率,因为Any
会尽快中断:
int contains = phrases.Count(p => foulWords.Any(fw => p.Contains(fw)));
您的方法也不是最佳方法,因为您的起点是List1
(foulWords
),因此您需要每个计数的总和,这是低效的。正确的结果必须介于0(没有匹配的犯规词)和phrases.Count
之间(所有短语都包含一个犯规词)。所以起点应该是phrases
。
问:你能否帮我修改上面的代码,也给我INDEX 列表中的短语?
是:
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