private bool ProcessGoodFiles()
 {
     ColorsLeftAfterFirstGood = 0;
     ColorsLeftAfterLastGood  = 0;
     try
     {
         foreach (FileData snap in GoodSnaps)
         {
             if (SelectedColorsSoFar.Count == 0)
             {
                 if (!ProcessFirstGoodFile(snap))
                 {
                     return(false);
                 }
                 ColorsLeftAfterFirstGood = SelectedColorsSoFar.Count();
             }
             else
             if (!ProcessNextGoodFile(snap))
             {
                 Debug.WriteLine("The file {0} finished to kill its category {1}", snap.FileName, Label);
                 KilledBy = snap.FileName;
                 return(false);
             }
         }
         return(SelectedColorsSoFar.Count > 0);
     }
     finally
     {
         ColorsLeftAfterLastGood = SelectedColorsSoFar.Count;
         Debug.WriteLine("Processing {0} good files on {1} => Colors dropped from {2} down to {3}", GoodSnaps.Count, Label, ColorsLeftAfterFirstGood, ColorsLeftAfterLastGood);
     }
 }
 private bool ProcessBadFile(FileData data)
 {
     foreach (int color in data.OwnStats.Keys)
     {
         if (SelectedColorsSoFar.ContainsKey(color))
         {
             SelectedColorsSoFar.Remove(color);
         }
     }
     //SelectedColorsSoFar.Remove(color);
     return(SelectedColorsSoFar.Count > 0);
 }
 private bool ProcessNextGoodFile(FileData data)
 {
     SelectedColorsSoFar = SelectedColorsSoFar.Where(kvp => data.OwnStats.ContainsKey(kvp.Key)).ToDictionary(kvp => kvp.Key, kvp => kvp.Value + data.OwnStats[kvp.Key]);
     return(SelectedColorsSoFar.Count > 0);
 }