我有以下代码:

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提取直接移到密钥创建。因此,您将忽略引入新的范围变量。

10-07 21:34