我的代码是在行列表中搜索最小值和最大值。我需要这个来找到限制我复杂绘图的矩形中心。
我的代码部分如下所示:
if (line.X1 < Min.X) Min.X = line.X1;
if (line.Y1 < Min.Y) Min.Y = line.Y1;
if (line.X2 < Min.X) Min.X = line.X2;
if (line.Y2 < Min.Y) Min.Y = line.Y2;
我不喜欢这个难看的复制粘贴代码。如何简化/使其更优雅?
答案 0 :(得分:3)
这样的事情怎么样:
var xList = {line.X1, line.X2, ...};
var yList = {line.Y1, line.Y2, ...};
Min.X = xList.Min();
Min.Y = yList.Min();
答案 1 :(得分:1)
给出以下填充变量:
List<Line> lines;
获取X值和Y值:
var xValues = lines.SelectMany(line => new[] { line.X1, line.X2 });
var yValues = lines.SelectMany(line => new[] { line.Y1, line.Y2 });
然后得到每个的最小值和最大值:
var leastX = xValues.Min();
var greatestX = xValues.Max();
var leastY = yValues.Min();
var greatestY = yValues.Max();
请注意,此代码未经过测试。
答案 2 :(得分:1)
这是使用Math.Min的另一种选择:
Min.X = Math.Min(line.X2, Math.Min(line.X1, Min.X));
Min.Y = Math.Min(line.Y2, Math.Min(line.Y1, Min.Y));
答案 3 :(得分:1)
你班级的设计已经有了一些重复;您Line
课程对Point
的定义在X1
,X2
等中重复。
如果你的设计看起来像这样:
class Point
{
public int X { get; set; }
public int Y { get; set; }
}
class Line
{
public Point Start { get; set; }
public Point End { get; set; }
public IEnumerable<Point> Endpoints
{
get
{
return new[] { Start, End };
}
}
}
您可以像这样实施计算:
class ExtremetiesDeterminer
{
private IEnumerable<Point> endpoints;
public Line DetermineBoundaries(IEnumerable<Line> complicatedShapeLines)
{
endpoints = complicatedShapeLines.SelectMany(line => line.Endpoints);
return new Line
{
Start = FindExtremety(Enumerable.Min),
End = FindExtremety(Enumerable.Max)
};
}
private Point FindExtremety(
SingleAxisExtremetyDeterminer findSingleAxisExtremety)
{
return new Point
{
X = findSingleAxisExtremety(endpoints, point => point.X),
Y = findSingleAxisExtremety(endpoints, point => point.Y)
};
}
public delegate int SingleAxisExtremetyDeterminer(
IEnumerable<Point> points, Func<Point, int> getCoordinate);
}
请注意,这可以减少重复。您可能希望根据它与代码的其余部分的交互方式进行调整。