【问题标题】:Creating List of Pair type (Value,Value) in C#在 C# 中创建对类型(值,值)的列表
【发布时间】:2019-08-10 14:40:07
【问题描述】:

我想创建一对包含一些 int 值的列表,例如

(3,4) , (5,4) ,(5,1)....(n,n)

然后将每个目标与单个目标匹配

(1,1)

我需要将列表的每个值与目标 (1,1) 进行比较,以便它应该打印最接近的点 (1,1)

预期结果。

(3,4)

什么是最近的

最近的意思,假设我们有数字 4,5,6,7,8 并且我想找到最接近 12 的数字所以答案将是 8 因为它需要 4 才能达到 12 但 4+n 移动才能达到12 来自其他,所以与单个值不同,我有一对值 (n,n).... 并与 (n,n) 进行比较

我使用 2D 数组的尝试

positions = new int[3][,] 
{
new int[,] { {3,4} },
new int[,]{ {5,4}},
 new int[,] { {5,1} }

};

这给了我

3,4

5,4

5,1

现在我需要将每个值与 (1,1) 进行比较,但我不知道任何适当的数据结构可以通过它轻松存储我的列表并将每个值与 (1,1) 进行比较。

请帮忙

【问题讨论】:

  • 什么是“将每个值与(1,1) 进行比较”? (5,1) 是否仅匹配 (1,1)
  • 不,我只需要找到指向 1,1 的最小点,因此首先将 3,4 与 1,1 进行比较,然后将 3,4 设置为比与 5,4 相比最小的点,依此类推...所以最后最接近的点将是 3,4
  • “最近”是什么意思?你只比较第一个数字吗?
  • 请查看问题,我已经更新了在这种情况下最近的定义
  • 最近的不是 (5,1)?

标签: c# arrays loops


【解决方案1】:

C# 7 有元组,我想你正在寻找它!

例如元组列表:

var positions = new List<(int x, int y)>
{
    (3,4),
    (5,4),
    (5,1)
};

您可以像这样找到“最近的”:

(int x, int y) value = (1, 1);
var closest = positions.OrderBy(p => (p.x - value.x) + (p.y - value.y)).First(); // finds (5,1)

【讨论】:

    【解决方案2】:

    我将假设这些点是平面上的点,我们可以使用Pythagorean theorem 来获取两点之间的距离。

    排除这种假设,我将创建一个新类来保存 x/y 位置数据和一个运行 Pythagorean theoremDistanceBetween 方法。

    static void Main(string[] args)
    {
        List<Point> points = new List<Point>
        {
            new Point(3, 4),
            new Point(5, 4),
            new Point(5, 1)
        };
    
        Point closestPoint = points.OrderBy(point => point.DistanceFromPoint(new Point(1, 1))).FirstOrDefault();
    
        Console.WriteLine($"The closest point to 1,1 is {closestPoint.PosX},{closestPoint.PosY}");
        Console.ReadLine();
    }
    
    private class Point
    {
        public Point(int posX, int posY)
        {
            PosX = posX;
            PosY = posY;
        }
    
        public int PosX { get; set; }
        public int PosY { get; set; }
    
        public double DistanceFromPoint(Point otherPoint)
        {
            return Math.Sqrt(Math.Pow((otherPoint.PosX - PosX), 2) + Math.Pow((otherPoint.PosY - PosY), 2));
        }
    }
    

    【讨论】:

    • 我认为这也很好(我在“自己的”类和元组之间怀疑)
    • 当我假设它们是几何点时,感觉在方法中包含公式比在 linq 中更容易:)。但你的也完全可以完成这项工作
    猜你喜欢
    • 2012-10-27
    • 1970-01-01
    • 2019-07-27
    • 2012-03-30
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多