/// <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; }
/// <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--; } } }