/// <summary>
        /// Removes all entries that have the specified top value.
        /// </summary>
        /// <param name="top"></param>
        /// <returns>The number of entries removed.</returns>
        public int RemoveAll(L1T top)
        {
            //ICollection<KeyValuePair<CompT, TValue>> r = (ICollection<KeyValuePair<CompT, TValue>>) this;

            var thisAsCollection = this as ICollection <KeyValuePair <ExKeyT, IPropBag> >;

            List <KeyValuePair <ExKeyT, IPropBag> > toRemove = new List <KeyValuePair <ExKeyT, IPropBag> >();

            foreach (KeyValuePair <ExKeyT, IPropBag> kvp in thisAsCollection)
            {
                L1T foundTop = CompKeyManager.Split(kvp.Key, out L2T bot);
                if (foundTop.Equals(top))
                {
                    toRemove.Add(kvp);
                }
            }

            int result = 0;

            foreach (KeyValuePair <ExKeyT, IPropBag> kvp in toRemove)
            {
                thisAsCollection.Remove(kvp);
                result++;
            }
            return(result);
        }
        public bool ContainsKey(L1T top, L2T bot)
        {
            ExKeyT key    = CompKeyManager.Join(top, bot);
            bool   result = ContainsKey(key);

            return(result);
        }
        public bool ContainsKey(L1T top, L2TRaw rawBot)
        {
            ExKeyT key    = CompKeyManager.Join(top, Level2KeyManager.FromRaw(rawBot));
            bool   result = ContainsKey(key);

            return(result);
        }
        public bool TryGetValue(L1T top, L2TRaw rawBot, out IPropData value)
        {
            bool result;

            if (CompKeyManager.TryJoin(top, rawBot, out ExKeyT comp))
            {
                result = TryGetValue(comp, out value);
                return(result);
            }
            else
            {
                value = default(IPropData);
                return(false);
            }
        }
        public bool TryGetValue(L1T top, L2T bot, out IPropData value)
        {
            ExKeyT key = CompKeyManager.Join(top, bot);

            return(TryGetValue(key, out value));
        }
        public bool TryAdd(L1T top, L2T bot, IPropData value)
        {
            ExKeyT key = CompKeyManager.Join(top, bot);

            return(TryAdd(key, value));
        }
        public IPropData GetOrAdd(L1T top, L2T bot, IPropData value)
        {
            ExKeyT key = CompKeyManager.Join(top, bot);

            return(GetOrAdd(key, value));
        }
        public bool TryRemove(L1T top, L2TRaw rawBot, out IPropData value)
        {
            ExKeyT key = CompKeyManager.Join(top, Level2KeyManager.FromRaw(rawBot));

            return(TryRemove(key, out value));
        }
        public IPropData GetOrAdd(L1T top, L2TRaw rawBot, IPropData value)
        {
            ExKeyT key = CompKeyManager.Join(top, Level2KeyManager.FromRaw(rawBot));

            return(GetOrAdd(key, value));
        }