convert C# code to LINQ
I want to know if and how to convert that code to LINQ.


    private PointF FindCrashPoint()
    {
        List<PointF> bikeLeftEdge, bikeRightEdge, searchedEdge, otherEdge;
        BikeEdges(out bikeLeftEdge, out bikeRightEdge);
    
        // Find the first point of the bike that's outside the track.
        int firstOutsideTheTrack = bikeLeftEdge.FindIndex(point => !track.OnTrack(point));
        if (firstOutsideTheTrack != -1)
        {
            searchedEdge = bikeLeftEdge;
            otherEdge = bikeRightEdge;
        }
        else
        {
            firstOutsideTheTrack = bikeRightEdge.FindIndex(point => !track.OnTrack(point));
            if (firstOutsideTheTrack == -1)
                throw new CrashPointNotFound("Every checked bike's point was inside the track.");
            searchedEdge = bikeRightEdge;
            otherEdge = bikeLeftEdge;
        }
    
        // Find the closest point to the first outside the track which is already
        // inside the track. That's the crash point.
        if (firstOutsideTheTrack > 0)
            return searchedEdge[firstOutsideTheTrack - 1];
    
        int firstInsideTheTrack = searchedEdge.FindIndex(track.OnTrack);
        if (firstInsideTheTrack == -1)
        {
            firstInsideTheTrack = otherEdge.FindIndex(track.OnTrack);
            if (firstInsideTheTrack == -1)
                throw new CrashPointNotFound("Every checked bike's point was outside the track.");
            searchedEdge = otherEdge;
        }
    
        return searchedEdge[firstInsideTheTrack];
    }
convert C# code to LINQ
===

I want to know if and how to convert that code to LINQ.


    private PointF FindCrashPoint()
    {
        List<PointF> bikeLeftEdge, bikeRightEdge, searchedEdge, otherEdge;
        BikeEdges(out bikeLeftEdge, out bikeRightEdge);
    
        // Find the first point of the bike that's outside the track.
        int firstOutsideTheTrack = bikeLeftEdge.FindIndex(point => !track.OnTrack(point));
        if (firstOutsideTheTrack != -1)
        {
            searchedEdge = bikeLeftEdge;
            otherEdge = bikeRightEdge;
        }
        else
        {
            firstOutsideTheTrack = bikeRightEdge.FindIndex(point => !track.OnTrack(point));
            if (firstOutsideTheTrack == -1)
                throw new CrashPointNotFound("Every checked bike's point was inside the track.");
            searchedEdge = bikeRightEdge;
            otherEdge = bikeLeftEdge;
        }
    
        // Find the closest point to the first outside the track which is already
        // inside the track. That's the crash point.
        if (firstOutsideTheTrack > 0)
            return searchedEdge[firstOutsideTheTrack - 1];
    
        int firstInsideTheTrack = searchedEdge.FindIndex(track.OnTrack);
        if (firstInsideTheTrack == -1)
        {
            firstInsideTheTrack = otherEdge.FindIndex(track.OnTrack);
            if (firstInsideTheTrack == -1)
                throw new CrashPointNotFound("Every checked bike's point was outside the track.");
            searchedEdge = otherEdge;
        }
    
        return searchedEdge[firstInsideTheTrack];
    }