我想在xy点数据列表中找到最小差异.(可以包含重复的x值和y值)
Example:
List<Point> differenceList = new List<Point>() { (10,0), (10,20), (20,30), (12,61) };
Run Code Online (Sandbox Code Playgroud)
预期结果
X difference = 2
Y difference = 20
Run Code Online (Sandbox Code Playgroud)
是否有可能优雅地使用linq/lambda表达式?谢谢!
"优雅"是一个大词......优雅在旁观者的眼中.这会奏效.我不会向你解释,因为你在问之前没有表明你做了什么.
class Point
{
public Point(int x, int y)
{
X = x;
Y = y;
}
public int X;
public int Y;
}
List<Point> differenceList = new List<Point>() { new Point(40, 60), new Point(10, 20), new Point(20, 30), new Point(12, 61) };
Func<Point, int> getPointX = p => p.X;
Func<Point, int> getPointY = p => p.Y;
Func<Func<Point, int>, int> finder = getter =>
{
var temp = differenceList.OrderBy(getter).ToList();
var min = temp.Zip(temp.Skip(1), (p, q) => getter(q) - getter(p)).Min();
return min;
};
var minX = finder(getPointX);
var minY = finder(getPointY);
Run Code Online (Sandbox Code Playgroud)
我要补充一点,如果你想要p和q值给你最小的差异,那么优雅就会消失.遗憾的是,如果该对象没有实现,LINQ中提取最小"对象"并不容易IComparable.
如果你真的想要完整的数据,幸运的是Tuple<>实现IComparable,那么你有:
Func<Func<Point, int>, Tuple<int, int, int>> finder = getter =>
{
var temp = differenceList.OrderBy(getter).ToList();
var min = temp.Zip(temp.Skip(1), (p, q) => Tuple.Create<int, int, int>(getter(q) - getter(p), getter(q), getter(p))).Min();
return min;
};
var minX = finder(getPointX);
var minY = finder(getPointY);
Console.WriteLine("X difference = {0} (which is {1} - {2})", minX.Item1, minX.Item2, minX.Item3);
Console.WriteLine("Y difference = {0} (which is {1} - {2})", minY.Item1, minY.Item2, minY.Item3);
Run Code Online (Sandbox Code Playgroud)