public void TrimToMaxSize(Type type)
        {
            var newItems     = GetNewItemsByType(type);
            var currentItems = GetItemsByType(type);

            foreach (var curItem in currentItems)
            {
                var existingItem = newItems.FirstOrDefault(it => it.Node.Equals(curItem.Node));
                if (existingItem != null)
                {
                    if (curItem.GetFitness() < existingItem.GetFitness())
                    {
                        newItems.Remove(existingItem);
                        newItems.Add(curItem);
                    }
                }
                else
                {
                    newItems.Add(curItem);
                }
            }
            currentItems.Clear();
            if (newItems.Count > MaxSizePerType)
            {
                newItems.Sort();
                currentItems.Clear();

                var selector = new RankBasedPoolItemSelector <PoolItem>();
                while (currentItems.Count < MaxSizePerType && newItems.Count > 0)
                {
                    var item         = selector.DrawFromList(newItems);
                    var existingItem = FindNode(item.Node);
                    if (existingItem == null)                           // no duplicates
                    {
                        currentItems.Add(item);
                    }
                    else if (item.GetFitness() < existingItem.GetFitness())
                    {
                        currentItems.Remove(existingItem);
                        currentItems.Add(item);
                    }
                    newItems.Remove(item);
                }
            }
            else
            {
                currentItems.AddRange(newItems);
            }
            currentItems.Sort();
            newItems.Clear();
        }
 public RecordBasedSubTreePool(int maxDepth = -1) : base(maxDepth)
 {
     Selector = new RankBasedPoolItemSelector <PoolItem>();
 }