コード例 #1
0
ファイル: RangeTreeNode.cs プロジェクト: ManuelOTuga/PoE
        /// <summary>
        /// Performans a "stab" query with a single value.
        /// All items with overlapping ranges are returned.
        /// </summary>
        public List <T> Query(TKey value)
        {
            var results = new List <T>();

            // If the node has items, check their ranges.
            if (_items != null)
            {
                foreach (var o in _items)
                {
                    if (o.Range.From.CompareTo(value) > 0)
                    {
                        break;
                    }
                    else if (o.Range.Contains(value))
                    {
                        results.Add(o);
                    }
                }
            }

            // go to the left or go to the right of the tree, depending
            // where the query value lies compared to the center
            if (value.CompareTo(_center) < 0 && _leftNode != null)
            {
                results.AddRange(_leftNode.Query(value));
            }
            else if (value.CompareTo(_center) > 0 && _rightNode != null)
            {
                results.AddRange(_rightNode.Query(value));
            }

            return(results);
        }
コード例 #2
0
        /// <summary>
        /// Performans a "stab" query with a single value.
        /// All items with overlapping ranges are returned.
        /// </summary>
        public IEnumerable <RangeValuePair <TKey, TValue> > Query(TKey value)
        {
            var results = new List <RangeValuePair <TKey, TValue> >();

            // If the node has items, check for leaves containing the value.
            if (_items != null)
            {
                foreach (var o in _items)
                {
                    if (_comparer.Compare(o.From, value) > 0)
                    {
                        break;
                    }
                    else if (_comparer.Compare(value, o.From) >= 0 && _comparer.Compare(value, o.To) <= 0)
                    {
                        results.Add(o);
                    }
                }
            }

            // go to the left or go to the right of the tree, depending
            // where the query value lies compared to the center
            var centerComp = _comparer.Compare(value, _center);

            if (_leftNode != null && centerComp < 0)
            {
                results.AddRange(_leftNode.Query(value));
            }
            else if (_rightNode != null && centerComp > 0)
            {
                results.AddRange(_rightNode.Query(value));
            }

            return(results);
        }
コード例 #3
0
        /// <summary>
        /// Performans a "stab" query with a single value.
        /// All items with overlapping ranges are returned.
        /// </summary>
        public List <T> Query(TKey value)
        {
            if (!_isInSync && _autoRebuild)
            {
                Rebuild();
            }

            return(_root.Query(value));
        }
コード例 #4
0
ファイル: RangeTree.cs プロジェクト: erdomke/RangeTree
        /// <summary>
        /// Performans a range query.
        /// All items with overlapping ranges are returned.
        /// </summary>
        public IEnumerable <RangeValuePair <TKey, TValue> > this[TKey from, TKey to]
        {
            get
            {
                if (!_isInSync && _autoRebuild)
                {
                    Rebuild();
                }

                return(_root.Query(from, to));
            }
        }
コード例 #5
0
 /// <summary>
 /// Performans a "stab" query with a single value.
 /// All items with overlapping ranges are returned.
 /// </summary>
 public List <T> Query(TKey value)
 {
     return(_root.Query(value));
 }