private List<DuplicateArchiveInfoList> BuildDuplicateList(List<DuplicateArchiveInfo> list, DuplicateSearchOption option)
{
NotifyCaller("Start building duplicate list.", OperationStatus.BUILDING_DUPLICATE_LIST);
List<DuplicateArchiveInfoList> dupList = new List<DuplicateArchiveInfoList>();
list.Sort(new DuplicateArchiveInfoItemCountComparer());
int totalCount = list.Count;
int i = 0;
while (list.Count > 0)
{
_pauseEvent.WaitOne(Timeout.Infinite);
if (_shutdownEvent.WaitOne(0))
{
NotifyCaller("Stopping...", OperationStatus.BUILDING_DUPLICATE_LIST);
break;
}
++i;
DuplicateArchiveInfoList dup = new DuplicateArchiveInfoList();
DuplicateArchiveInfo temp = list[0];
list.RemoveAt(0);
dup.Original = temp;
string message = "Checking: " + temp.Filename + " ( Duplicate group found: " + i + " File to check left: " + list.Count + ")";
NotifyCaller(message, OperationStatus.BUILDING_DUPLICATE_LIST, curr:i, total:totalCount);
// check for other possible dups.
int index = 0;
while (list.Count > index)
{
DuplicateArchiveInfo curr = list[index];
if (Compare(ref temp, ref curr, option))
{
if (dup.Duplicates == null) dup.Duplicates = new List<DuplicateArchiveInfo>();
dup.Duplicates.Add(curr);
// remove from the source list.
list.Remove(curr);
--totalCount;
}
else
{
++index;
}
}
dupList.Add(dup);
}
foreach (DuplicateArchiveInfoList dup in dupList)
{
if (dup.Duplicates != null)
{
dup.Duplicates.Sort(new DuplicateArchiveInfoPercentageComparer());
}
}
NotifyCaller("Building Duplicate List Complete.", OperationStatus.BUILDING_DUPLICATE_LIST);
return dupList;
}