对于大型数据集,c#custom group真的很慢

rks*_*rst 1 c# optimization performance

当我运行以下代码时,campaign.Count()为200,000,这段代码非常慢.

List<Campaign> listCampaigns = new List<Campaign>();
        foreach (var item in campaigns)
        {
            if (listCampaigns.Where(a => a.CampaignName == item.CampaignName && a.Term == item.Term).Count() == 0)
            {
                //this doesn't exist
                listCampaigns.Add(item);
            }
            else
            {
                //this exists already
                var campaign = listCampaigns.Where(a => a.CampaignName == item.CampaignName && a.Term == item.Term).First();
                campaign.TotalVisits += item.TotalVisits;
                List<Conversion> listConversions = item.Conversions.ToList();
                listConversions.AddRange(campaign.Conversions.ToList());
                campaign.Conversions = listConversions.ToArray();
            }
        }
Run Code Online (Sandbox Code Playgroud)

是否有优化此代码的部分或使用另一种方法来加快它?

任何建议表示赞赏.谢谢.

dig*_*All 9

这应该快得多:

List<Campaign> listCampaigns = new List<Campaign>();
foreach (var g in campaigns.GroupBy(c => new { c.CampaignName, c.Term }))
{
    var campaign = g.First();
    campaign.TotalVisits = g.Sum(x => x.TotalVisits);
    campaign.Conversions = g.SelectMany(c => c.Conversions).ToArray();
    listCampaigns.Add(campaign);
}
Run Code Online (Sandbox Code Playgroud)

  • 对于那些认为任何基于foreach的代码本身比LINQ更快的人来说,这个应该被用作一个例子.与原始代码相比,您的解决方案快速疯狂. (2认同)