escribir un comparador personalizado para linq groupby

Nuevamente, esta muestra es una versión muy simplificada de mi problema real que involucra un comparador personalizado para la agrupación de linq. ¿Qué he hecho mal?

El siguiente código produce el resultado a continuación (1.2, 0), (4.1, 0), (4.1, 0), (1.1, 0),

Sin embargo, esperaba lo siguiente ya que 1.1 y 1.2 están separados <1.0. (1.2, 0), (1.1, 0), (4.1, 0), (4.1, 0),

class Program
{
    static void Main(string[] args)
    {
        IEnumerable<Point> points = new List<Point> { 
            new Point(1.1, 0.0)
            , new Point(4.1, 0.0) 
            , new Point(1.2, 0.0)
            , new Point(4.1, 0.0)
        };

        foreach (var group in points.GroupBy(p => p, new PointComparer()))
        {
            foreach (var num in group)
                Console.Write(num.ToString() + ", ");

            Console.WriteLine();
        }

        Console.ReadLine();
    }
}

class PointComparer : IEqualityComparer<Point>
{
    public bool Equals(Point a, Point b)
    {
        return Math.Abs(a.X - b.X) < 1.0;
    }

    public int GetHashCode(Point point)
    {
        return point.X.GetHashCode()
            ^ point.Y.GetHashCode();
    }
}

class Point
{
    public double X;
    public double Y;

    public Point(double p1, double p2)
    {
        X = p1;
        Y = p2;
    }

    public override string ToString()
    {
        return "(" + X + ", " + Y + ")";
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta