示例#1
0
        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
        }
示例#2
0
        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
        }