Дизайн ваших классов уже имеет некоторое дублирование; определение вашего 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);
}
Обратите внимание, что это уменьшает дублирование. Вероятно, вы захотите настроить это в зависимости от того, как это взаимодействует с остальной частью вашего кода.
Вы можете использовать LINQ. Вы пробовали это? Возможно, что-то вроде этого: http://stackoverflow.com/questions/1107868/linq-min-max – Aaron
Из любопытства почему бы не использовать массив? Если вы используете массив, вы можете использовать linq для его запроса. –
Боковое примечание: я не думаю, что min/max поможет вам с «центром» (также это зависит от вашего определения центра ...). –