如何简化我的代码? (在行列表中搜索最小和最大坐标)

时间:2014-02-18 04:03:11

标签: c# simplify

我的代码是在行列表中搜索最小值和最大值。我需要这个来找到限制我复杂绘图的矩形中心。

我的代码部分如下所示:

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;

我不喜欢这个难看的复制粘贴代码。如何简化/使其更优雅?

4 个答案:

答案 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的定义在X1X2等中重复。

如果你的设计看起来像这样:

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);
}

请注意,这可以减少重复。您可能希望根据它与代码的其余部分的交互方式进行调整。