public static void CreateMergedReport(Folder destination, Folder[] analyzerReports)
        {
            var assemblyData = new Dictionary <string, AnalyzerAssemblyData>();

            foreach (var report in analyzerReports)
            {
                foreach (var folder in report.Children.OfType <Folder>())
                {
                    var data = AnalyzerAssemblyData.FromFolder(folder);
                    if (assemblyData.TryGetValue(data.Name, out var existingData))
                    {
                        existingData.CombineWith(data);
                    }
                    else
                    {
                        assemblyData.Add(data.Name, data);
                    }
                }
            }

            foreach (var data in assemblyData.OrderByDescending(data => data.Value.TotalTime))
            {
                var folder = new Folder {
                    Name = $"{TextUtilities.DisplayDuration(data.Value.TotalTime, showZero: true)}   {data.Value.Name}"
                };
                foreach (var analyzer in data.Value.AnalyzerTimes.OrderByDescending(analyzer => analyzer.Value).ThenBy(analyzer => analyzer.Key, StringComparer.OrdinalIgnoreCase))
                {
                    folder.AddChild(new Item {
                        Name = analyzer.Key, Text = TextUtilities.DisplayDuration(analyzer.Value, showZero: true)
                    });
                }

                destination.AddChild(folder);
            }
        }
 public void CombineWith(AnalyzerAssemblyData other)
 {
     Debug.Assert(Name == other.Name);
     TotalTime += other.TotalTime;
     foreach (var pair in other.AnalyzerTimes)
     {
         _ = AnalyzerTimes.TryGetValue(pair.Key, out var existingTime);
         AnalyzerTimes[pair.Key] = existingTime + pair.Value;
     }
 }
            public static AnalyzerAssemblyData FromFolder(Folder folder)
            {
                var(assemblyName, assemblyTime) = ParseLine(folder.Name);
                var data = new AnalyzerAssemblyData(assemblyName, assemblyTime);

                foreach (var message in folder.Children.OfType <Message>())
                {
                    var(analyzerName, analyzerTime)  = ParseLine(message.Text);
                    data.AnalyzerTimes[analyzerName] = analyzerTime;
                }

                return(data);