protected override bool TryRemoveEntity(int key, TEntity entity, Component changedComponent)
        {
            if (Index.TryGetValue(key, out var referencingEntities))
            {
                if (!_sortValueGetter.TryGetKey(entity, new IPropertyValueChange[0], getOldValue: false,
                                                out var sortKey))
                {
                    sortKey = referencingEntities.Where(p => p.Value == entity).Select(p => p.Key).FirstOrDefault();
                }

                if (sortKey != default &&
                    referencingEntities.Remove(sortKey))
                {
                    if (referencingEntities.Count == 0)
                    {
                        Index.Remove(key);
                    }

                    OnEntityRemoved(entity, changedComponent, FindReferenced(key, entity, fallback: true));
                    return(true);
                }
            }

            if (OrphanedEntities != null &&
                OrphanedEntities.TryGetValue(key, out var orphanedEntities))
            {
                orphanedEntities.Remove(entity);
                if (orphanedEntities.Count == 0)
                {
                    OrphanedEntities.Remove(key);
                }
            }

            return(false);
        }
        private HashSet <TEntity> GetOrAddOrphanedEntities(int key)
        {
            if (!OrphanedEntities.TryGetValue(key, out var entities))
            {
                entities = new HashSet <TEntity>(EntityEqualityComparer <TEntity> .Instance);
                OrphanedEntities.Add(key, entities);
            }

            return(entities);
        }