【问题标题】:How to simplify my code? (Searching for minimum and maximum coordinates in list of lines)如何简化我的代码? (在行列表中搜索最小和最大坐标)
【发布时间】:2014-02-18 04:03:10
【问题描述】:

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

我的部分代码如下所示:

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;

我不喜欢这种丑陋的复制粘贴代码。我怎样才能简化它/使它更优雅?

【问题讨论】:

  • 你可以使用 LINQ。你试过吗?也许,像这样:stackoverflow.com/questions/1107868/linq-min-max
  • 出于好奇,为什么不使用数组呢?如果你使用一个数组,你可以使用 linq 来查询它
  • 旁注:我不认为 min/max 会帮助你“中心”(也取决于你对中心的定义......)。
  • @AlexeiLevenkov 我需要包围我的形状/绘图的矩形中心。抱歉描述不好/我修好了。
  • @DanDrews 我只是不喜欢数组,集合是如此易于使用和操作...

标签: c# simplify


【解决方案1】:

这样的事情怎么样:

var xList = {line.X1, line.X2, ...};
var yList = {line.Y1, line.Y2, ...};

Min.X = xList.Min();
Min.Y = yList.Min();

【讨论】:

  • 这是一个很好的答案和很好的建议,但我不得不接受更多细节和一些描述的答案。
【解决方案2】:

给定以下填充变量:

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

请注意,此代码未经测试。

【讨论】:

    【解决方案3】:

    这里还有另一个选项,只使用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));
    

    【讨论】:

      【解决方案4】:

      您的课程设计已经有一些重复;您的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);
      }
      

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

      【讨论】:

        猜你喜欢
        • 2018-04-09
        • 2014-11-03
        • 2018-09-29
        • 2020-03-20
        • 1970-01-01
        • 2018-12-23
        • 1970-01-01
        • 1970-01-01
        • 2017-08-31
        相关资源
        最近更新 更多