private void _flowWater(Watershed newCell, Watershed oldCell)
        {
            if (oldCell == null)
            {
                _flowWater(Grid.First(c => c.Coordinate == newCell.FlowCoordinate), newCell);
            }

            else if (!newCell.IsIdentified && !oldCell.IsIdentified)
            {
                if (!oldCell.IsSink)
                {
                    _flowWater(Grid.First(c => c.Coordinate == newCell.FlowCoordinate), newCell);
                }
                else
                {
                    oldCell.Identifier = IDENTIFIERS[CURRENT_IDENTIFIER_INDEX++];
                }

                oldCell.Identifier = newCell.Identifier;
            }
            else if (!newCell.IsIdentified && oldCell.IsIdentified)
            {
                newCell.Identifier = oldCell.Identifier;
                if (!newCell.IsSink)
                {
                    _flowWater(Grid.First(c => c.Coordinate == newCell.FlowCoordinate), newCell);
                }
            }
            else if (newCell.IsIdentified && !oldCell.IsIdentified)
            {
                oldCell.Identifier = newCell.Identifier;
            }
        }
        private Point _getFlowCoordinate(Watershed cell, IEnumerable <Point> neighbors)
        {
            if (neighbors.Count() == 0)
            {
                return(cell.Coordinate);
            }

            int minValue = neighbors.Min(p => Grid.FirstOrDefault(c => c.Coordinate == p).Value);

            if (minValue >= cell.Value)
            {
                return(cell.Coordinate);
            }

            var eligableNeighbors = neighbors.Where(p => Grid.First(c => c.Coordinate == p).Value == minValue);

            //Eligable cells == 1
            if (eligableNeighbors.Count() == 1)
            {
                return(eligableNeighbors.First());
            }

            //Eligable cells > 1
            //North
            if (eligableNeighbors.Any(p => p.Y == cell.Coordinate.Y - 1))
            {
                return(eligableNeighbors.First(p => p.Y == cell.Coordinate.Y - 1));
            }
            //West
            if (eligableNeighbors.Any(p => p.X == cell.Coordinate.X - 1))
            {
                return(eligableNeighbors.First(p => p.X == cell.Coordinate.X - 1));
            }
            //East
            if (eligableNeighbors.Any(p => p.X == cell.Coordinate.X + 1))
            {
                return(eligableNeighbors.First(p => p.X == cell.Coordinate.X + 1));
            }
            //South
            if (eligableNeighbors.Any(p => p.Y == cell.Coordinate.Y + 1))
            {
                return(eligableNeighbors.First(p => p.Y == cell.Coordinate.Y + 1));
            }

            return(new Point(-1, -1));
        }