public int CompareTo(CrawlerItemIterator <TSort> .SortKey other)
            {
                TSort tsort = this.value;
                int   num   = tsort.CompareTo(other.value);

                if (num == 0)
                {
                    num = this.documentId.CompareTo(other.documentId);
                }
                if (num == 0)
                {
                    num = this.folderId.CompareTo(other.folderId);
                }
                if (!this.isAscending)
                {
                    num = -num;
                }
                return(num);
            }
        public IEnumerable <MdbCompositeItemIdentity> GetItems(MailboxSession session, TSort intervalStart, TSort intervalStop)
        {
            Util.ThrowOnNullArgument(session, "session");
            List <CrawlerItemIterator <TSort> .QueryResultWrapper> resultsToDispose = new List <CrawlerItemIterator <TSort> .QueryResultWrapper>();
            SortedList <CrawlerItemIterator <TSort> .SortKey, CrawlerItemIterator <TSort> .QueryResultWrapper> mergeList = new SortedList <CrawlerItemIterator <TSort> .SortKey, CrawlerItemIterator <TSort> .QueryResultWrapper>();

            try
            {
                using (IEnumerator <StoreObjectId> enumerator = this.folderIterator.GetFolders(session).GetEnumerator())
                {
                    while (enumerator.MoveNext())
                    {
                        StoreObjectId folderId = enumerator.Current;
                        CrawlerItemIterator <TSort> .QueryResultWrapper queryResultWrapper = new CrawlerItemIterator <TSort> .QueryResultWrapper(this.diagnosticsSession, session, folderId, this.sortProperty, intervalStart, intervalStop, this.filterPredicate, this.predicateProperties, this.maxRowCount);

                        resultsToDispose.Add(queryResultWrapper);
                        queryResultWrapper.CanCacheQueryResult = (50 < mergeList.Count);
                        if (queryResultWrapper.MoveNext())
                        {
                            mergeList.Add(queryResultWrapper.CurrentValue, queryResultWrapper);
                        }
                    }
                    goto IL_217;
                }
IL_11D:
                int cacheCounter = 0;
                using (IEnumerator <CrawlerItemIterator <TSort> .QueryResultWrapper> enumerator2 = mergeList.Values.GetEnumerator())
                {
                    if (enumerator2.MoveNext())
                    {
                        CrawlerItemIterator <TSort> .QueryResultWrapper result = enumerator2.Current;
                        yield return(result.CurrentIdentity);

                        mergeList.RemoveAt(0);
                        if (result.MoveNext())
                        {
                            mergeList.Add(result.CurrentValue, result);
                            if (cacheCounter > 0 && !result.CanCacheQueryResult)
                            {
                                result.CanCacheQueryResult = true;
                                cacheCounter--;
                            }
                        }
                        else if (result.CanCacheQueryResult)
                        {
                            cacheCounter++;
                        }
                    }
                }
IL_217:
                if (mergeList.Count > 0)
                {
                    goto IL_11D;
                }
            }
            finally
            {
                foreach (CrawlerItemIterator <TSort> .QueryResultWrapper queryResultWrapper2 in resultsToDispose)
                {
                    queryResultWrapper2.Dispose();
                }
                resultsToDispose.Clear();
            }
            yield break;
        }