如何获得这个锯齿状阵列的最后位置?

时间:2010-06-04 20:31:35

标签: c#

我有一个这样的类,我使用它作为数组中的点:

class Point
    {
        public int x;
        public int y;

        public Point(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    }

然后我试图获得最接近结尾的值:

public void Position()
        {
            for (int x = 0; x < arr.Length; x++)
            {
                for (int y = 0; y < arr[x].Length; y++)
                {
                    if (arr[x][y] == 3)
                        Pos.x = x;
                        Pos.y = y;
                    if (arr[x][y] == 1)
                        Pos.x = x;
                        Pos.y = y;
                    if (arr[x][y] == 2)
                        Pos.x = x;
                        Pos.y = y;
                }
            }
            Console.Write("Last Position: {0}, {1}",LastPos.x, LastPos.y);
        }

我知道这一点:

public Point Pos = new Point(0, 0);

它是一个锯齿状的数组,除了几个点之外都填充了全零。看起来像这样:

0 0 0 3 0 0 0 0

0 0 1 0 0 0 0

0 0 0 2 0 0 0 0

0 0 0 0 0

0 0 0 0 0 0 0

在这个例子中,2最接近末尾。位置为2,3,我想要Pos.x和Pos.y。它一直给我0,30。

3 个答案:

答案 0 :(得分:8)

看起来你错过了一些花括号。

if (arr[x][y] == 3)
{
    Pos.x = x;
    Pos.y = y;
}
if (arr[x][y] == 1)
{
    Pos.x = x;
    Pos.y = y;
}
if (arr[x][y] == 2)
{
    Pos.x = x;
    Pos.y = y;
}

在C#中,缩进并不重要,因此您的代码被解释为:

if (arr[x][y] == 3)
{
    Pos.x = x;
}
Pos.y = y;
if (arr[x][y] == 1)
{
    Pos.x = x;
}
Pos.y = y;
if (arr[x][y] == 2)
{
    Pos.x = x;
}
Pos.y = y;

您还可以大大简化代码:

if (arr[x][y] != 0)
{
    Pos.x = x;
    Pos.y = y;
}

另一个问题是您要设置Pos,但打印LastPos的值。

如果你需要更好的表现,请注意从开始向后搜索会更快,当你点击第一个非零元素而不是从头开始搜索并记住你最后一个非零元素时会更快看到。在许多情况下只检查几个元素后,这可能会终止 - 在最好的情况下,只需要检查一个元素。因此,根据您的数据大小,这样做的速度可能要快几百倍。

答案 1 :(得分:0)

我不确定您的变量究竟来自哪里,但看起来您在Pos变量中设置x / y并从LastPos变量中读取它们。

答案 2 :(得分:0)

也许不是最好的答案,但这是LINQ完成的事情。

int[][] array = new int[][] 
{
    new int[] {0, 0, 0, 3, 0, 0, 0, 0},
    new int[] {0, 0, 1, 0, 0, 0, 0},
    new int[] {0, 0, 0, 2, 0, 0, 0, 0 },
    new int[] {0, 0, 0, 0, 0 },
    new int[] {0, 0, 0, 0, 0, 0, 0 }
};

var query = (from row in array.Select((r, idx) => new { r, idx })
             where row.r.Any(item => item != 0)
             select new
             {
                 Row = row.idx,
                 Column = (from item in row.r.Select((i, idx) => new { i, idx })
                           where item.i != 0
                           select item.idx).Last()
             }).Last();

Console.WriteLine("{0}\t{1}", query.Row, query.Column);