Wieder ist dieses Beispiel eine sehr vereinfachte Version meines tatsächlichen Problems mit einem benutzerdefinierten Vergleich für linq Gruppierung. Was habe ich falsch gemacht?Schreiben eines benutzerdefinierten Vergleichs für linq groupby
Der folgende Code erzeugt das Ergebnis unter (1.2, 0), (4.1, 0), (4.1, 0), (1.1, 0),
jedoch seit 1.1 die folgende erwartete ich und 1.2 sind < 1,0 auseinander. (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 + ")";
}
}
Ich denke nicht, dass Sie Gruppe verwenden können, als eine Lösung für Clusterpunkte. Ein Grund ist, dass GetHashcode den gleichen Hash für gleiche Items zurückgeben muss. –