public IEnumerable <T> GetValuesBetween(T min, T max, IBPlusTreeComparer <T> comparer) { #region [.check input params.] if (0 < comparer.Compare(min, max)) { throw (new ArgumentException("max < min")); } #endregion #region [.-1,2- find nearest block.] var r = default(FindNearestBlockResult); if (!FindNearestBlock(min, ref r)) { yield break; } #endregion #region [.-3.1- first block.] for (var count = r.Block.Count; r.Index < count; r.Index++) { var v = r.Block[r.Index]; if (0 <= comparer.Compare(v, min)) //min <= t { if (0 < comparer.Compare(v, max)) //max < v { yield break; } yield return(v); for (r.Index++; r.Index < count; r.Index++) { v = r.Block[r.Index]; if (0 < comparer.Compare(v, max)) //max < v { yield break; } yield return(v); } } } #endregion #region [.-3.2- next block's.] for (var block = r.Block.Next; block != null; block = block.Next) { foreach (var v in block) { //if ( 0 <= comparer.Compare( v, min ) ) //min <= v //{ if (0 < comparer.Compare(v, max)) //max < v { yield break; } yield return(v); //} } } #endregion }
public IEnumerable <T> GetValues(T t, IBPlusTreeComparer <T> comparer) { #region [.-1,2- find nearest block.] var r = default(FindNearestBlockResult); if (!FindNearestBlock(t, ref r)) { yield break; } #endregion #region [.-3.1- first block.] for (var count = r.Block.Count; r.Index < count; r.Index++) { var v = r.Block[r.Index]; if (comparer.Compare(v, t) == 0) { yield return(v); for (r.Index++; r.Index < count; r.Index++) { v = r.Block[r.Index]; if (comparer.Compare(v, t) != 0) { yield break; } yield return(v); } } } #endregion #region [.-3.2- next block's.] for (var block = r.Block.Next; block != null; block = block.Next) { foreach (var v in block) { if (comparer.Compare(v, t) != 0) { yield break; } yield return(v); } } #endregion }