再次這個例子是一個非常簡化版本的實際問題,涉及linq分組的自定義比較器。我做錯了什麼?寫一個linq groupby的自定義比較器由
下面的代碼產生下面 的結果(1.2,0),因爲1.1, (4.1,0),(4.1,0), (1.1,0),
但是我期待以下和1.2是<分開。 (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 + ")";
}
}
我不認爲你可以使用group by作爲聚類點的解決方案。一個原因是GetHashcode必須返回相同項目的哈希。 –