public string GetUniqNameOfDocToBeFiled(int docIdx, string sortOrder)
        {
            // Get from cached list if possible
            bool retFromCache = false;
            lock (_cachedListOfSortedUniqNames)
            {
                if ((_cacheListOrder == sortOrder) && (!_cacheIsDirty) && (_cachedListOfSortedUniqNames.Count == _scanDocHandler.GetCountOfUnfiledDocs()))
                    retFromCache = true;
            }
            if (retFromCache)
                return GetUniqNameFromCacheList(docIdx);

            // Get the list of uniq names and find best match for each
            List<OrderableUniqName> sortableUniqNames = new List<OrderableUniqName>();
            int origIdx = 0;
            List<string> namesOfDocsToBeFiled = _scanDocHandler.GetCopyOfUnfiledDocsList();
            foreach (string uniqName in namesOfDocsToBeFiled)
            {
                string bestTypeMatch = "";
                DateTime bestTypeDate = DateTime.MinValue;
                lock(_lockForDocTypeListAccess)
                {
                    if (_bestDocTypeMatch.ContainsKey(uniqName))
                    {
                        bestTypeMatch = _bestDocTypeMatch[uniqName].docTypeName;
                        bestTypeDate = _bestDocTypeMatch[uniqName].docDate;
                    }
                }
                OrderableUniqName nt = new OrderableUniqName(uniqName, bestTypeMatch, bestTypeDate, origIdx);
                sortableUniqNames.Add(nt);
                origIdx++;
            }

            // Sort the names as required
            IEnumerable<OrderableUniqName> orderedList = null;
            switch(sortOrder)
            {
                case "original":
                    orderedList = sortableUniqNames.OrderBy(x => x.origDocIdx);
                    break;

                case "docType":
                    orderedList = sortableUniqNames.OrderBy(x => string.IsNullOrWhiteSpace(x.bestDocType)).ThenBy(x => x.bestDocType).ThenBy(x => x.foundDateTime).ThenBy(x => x.uniqName);
                    break;

                case "docDate":
                    orderedList = sortableUniqNames.OrderBy(x => x.foundDateTime).ThenBy(x => x.bestDocType).ThenBy(x => x.uniqName);
                    break;

                default:
                    orderedList = sortableUniqNames.OrderBy(x => x.uniqName).ThenBy(x => x.bestDocType).ThenBy(x => x.foundDateTime);
                    break;
            }

            // Return the appropriate file name
            lock (_cachedListOfSortedUniqNames)
            {
                _cachedListOfSortedUniqNames = orderedList.ToList();
                _cacheIsDirty = false;
                _cacheListOrder = sortOrder;
            }
            return GetUniqNameFromCacheList(docIdx);
        }
 public bool IsEqual(OrderableUniqName other)
 {
     if (uniqName != other.uniqName)
         return false;
     if (bestDocType != other.bestDocType)
         return false;
     if (foundDateTime != other.foundDateTime)
         return false;
     if (origDocIdx != other.origDocIdx)
         return false;
     return true;
 }