private static bool RemoveCircularDependencies(IsoSpriteSorting item, List <IsoSpriteSorting> _circularDepStack, Dictionary <int, bool> _circularDepData)
    {
        _circularDepStack.Add(item);
        bool removedDependency = false;

        int  id             = item.GetInstanceID();
        bool alreadyVisited = _circularDepData.TryGetValue(id, out bool inProcess);

        if (alreadyVisited)
        {
            if (inProcess)
            {
                RemoveCircularDependencyFromStack(_circularDepStack);
                removedDependency = true;
            }
        }
        else
        {
            _circularDepData[id] = true;

            List <IsoSpriteSorting> dependencies = item.VisibleMovingDependencies;
            for (int i = 0; i < dependencies.Count; i++)
            {
                if (RemoveCircularDependencies(dependencies[i], _circularDepStack, _circularDepData))
                {
                    removedDependency = true;
                }
            }
            dependencies = item.VisibleStaticDependencies;
            for (int i = 0; i < dependencies.Count; i++)
            {
                if (RemoveCircularDependencies(dependencies[i], _circularDepStack, _circularDepData))
                {
                    removedDependency = true;
                }
            }

            _circularDepData[id] = false;
        }

        _circularDepStack.RemoveAt(_circularDepStack.Count - 1);
        return(removedDependency);
    }
    private static void Visit(IsoSpriteSorting item, List <IsoSpriteSorting> sorted, HashSet <int> visited)
    {
        int id = item.GetInstanceID();

        if (!visited.Contains(id))
        {
            visited.Add(id);

            List <IsoSpriteSorting> dependencies = item.VisibleMovingDependencies;
            int dcount = dependencies.Count;
            for (int i = 0; i < dcount; i++)
            {
                Visit(dependencies[i], sorted, visited);
            }
            dependencies = item.VisibleStaticDependencies;
            dcount       = dependencies.Count;
            for (int i = 0; i < dcount; i++)
            {
                Visit(dependencies[i], sorted, visited);
            }

            sorted.Add(item);
        }
    }