我有以下代码:
var keywordItems = adwordsService
.ParseReport(report)
.Where(e => e.Keyword.IndexOf('+') == -1);
var keywordTranslations = keywordTranslationService
.GetKeywordTranslationsByClient(id);
model.KeywordItems = keywordItems
.Where(e =>
{
int lastUnderscore = e.CampaignName.LastIndexOf('_');
var identifer = e.CampaignName.Substring(lastUnderscore + 1);
var translation = keywordTranslations
.FirstOrDefault(t => t.translation == e.Keyword &&
t.LocalCombination_id == identifer);
return translation == null;
})
.OrderBy(e => e.Keyword);
它接收一个数组,然后根据这些元素是否已经被看到来过滤它们。
不过,这运行得很慢,因为有很多新的元素,所以我希望,如果有人能给我指出在这种情况下使用的最佳算法的正确方向。
最佳答案
简单连接将完成此任务-它使用哈希集在集合之间进行匹配,从而为搜索操作提供O(1):
from k in keywordItems
let identifer = k.CampaignName.Substring(k.CampaignName.LastIndexOf('_') + 1)
join t in keywordTranslations on
new { k.Keyword, Id = identifer } equals
new { Keyword = t.translation, Id = t.LocalCombination_id } into g
where !g.Any()
orderby k.Keyword
select k
要进一步提高性能,可以将
identifier
提取直接移到密钥创建。因此,您将忽略引入新的范围变量。