예제 #1
0
 /// <summary>
 /// Shuffle the enumerator position in the list.
 /// </summary>
 private static void ListInsert(SynchronizedEnumerator[] list, int index, SynchronizedEnumerator t, int headCount)
 {
     if (index >= headCount)
     {
         index = headCount - 1;
     }
     if (index < 0)
     {
         index = 0;
     }
     for (var j = 1; j <= index; j++)
     {
         list[j - 1] = list[j];
     }
     list[index] = t;
 }
예제 #2
0
        /// <summary>
        /// Binary search for the enumerator stack synchronization
        /// </summary>
        /// <param name="enumerators"></param>
        /// <returns></returns>
        private static IEnumerator <BaseData> GetBinarySearchMethod(IEnumerator <BaseData>[] enumerators)
        {
            //Create wrappers for the enumerator stack:
            var heads = new SynchronizedEnumerator[enumerators.Length];

            for (var i = 0; i < enumerators.Length; i++)
            {
                heads[i] = new SynchronizedEnumerator()
                {
                    Enumerator = enumerators[i]
                };
                if (enumerators[i].Current == null)
                {
                    enumerators[i].MoveNext();
                }
                heads[i].Time = enumerators[i].Current.Time;
            }

            //Presort the stack for the first time.
            Array.Sort(heads);
            var headCount = heads.Length;

            while (headCount > 0)
            {
                var min = heads[0];
                yield return(min.Enumerator.Current);

                if (min.Enumerator.MoveNext())
                {
                    var point = min.Enumerator.Current;
                    min.Time = point.Time;
                    var index = Array.BinarySearch(heads, min);
                    if (index < 0)
                    {
                        index = ~index;
                    }
                    ListInsert(heads, index - 1, min, headCount);
                }
                else
                {
                    min.Time = DateTime.MaxValue;
                    ListInsert(heads, headCount - 1, min, headCount);
                    headCount--;
                }
            }
        }