private void UpdateExtensionData(FileExtensionDataCollection data)
        {
            lock (data)
            {
                //TODO: pre-aggregate more stuff to avoid all this pointless aggregation/churning in display functionality.

                dgv_Extensions.DataSource = data.OrderBy(a => a.CompressionStats.AvgCompressionRatio ?? 1000).Select(a => new
                {
                    Extension = a.Extension,
                    TotalFileCount = a.Files.Files.Count,
                    TotalFileSize = a.Files.TotalFileSize.FormatFileSize(),
                    TestedFileCount = a.CompressionStats.CompressionResults.Count,
                    TestedFileSize = a.CompressionStats.CompressionResults.Aggregate(0L, (sum, item) => sum += item.TestedSize).FormatFileSize(),
                    TestResultFileSize = a.CompressionStats.CompressionResults.Aggregate(0L, (sum, item) => sum += item.TestResultBytes).FormatFileSize(),
                    AvgCompression = a.CompressionStats.AvgCompressionRatio == null ? "" : a.CompressionStats.AvgCompressionRatio.Value.ToString("0.0%"),
                    Known = a.KnownCompressed,
                    Description = a.Description,
                    Category = a.Category
                }).ToList();

                lbl_ExtensionsFoundValue.Text = data.Count.ToString();
                lbl_TotalFilesFoundValue.Text = data.Aggregate(0L, (count, pile) => count + pile.Files.Files.Count).ToString();
                lbl_TotalFileSizeValue.Text = data.Aggregate(0L, (size, pile) => size + pile.Files.TotalFileSize).FormatFileSize();
                lbl_ExtensionsTestedValue.Text = data.Where(a => a.CompressionStats.CompressionResults.Count > 0).Count().ToString();
                lbl_FilesTestedValue.Text = data.Aggregate(0, (count, pile) => count + pile.CompressionStats.CompressionResults.Count).ToString();
                lbl_TestedSizeValue.Text = data.Aggregate(0L, (size, pile) => size + pile.CompressionStats.CompressionResults.Aggregate(0L, (innerSize, testedFile) => innerSize += testedFile.TestedSize)).FormatFileSize();
                lbl_TestResultSizeValue.Text = data.Aggregate(0L, (size, pile) => size + pile.CompressionStats.CompressionResults.Aggregate(0L, (innerSize, testedFile) => innerSize += testedFile.TestResultBytes)).FormatFileSize();
            }
        }
 private void SurveyForm_Load(object sender, EventArgs e)
 {
     splitContainer1.Panel2Collapsed = true;
     Data = new FileExtensionDataCollection(StringComparer.OrdinalIgnoreCase);
     LoadCompressedList();
     UpdateExtensionData(Data);
 }