出于学习目的,我问“任何类型”,但实际上我现在正在处理一个
byte[,]
类型数组,它被称为 byteTable
,其内容如下所示:
00 01 E1 03 04 05
06 07 (08) 09 0A 0B
08 0D 0E 0F 10 (08)
12 13 14 15 04 17
(08) 19 {1A} 1B 1C 1D
1E 1F 20 10 (08) 23
括号只是为了便于阅读。我想找到数组中唯一的
1A
字节的索引,然后找到从 08
垂直向上方向最近的非唯一 1A
字节值并获取其距离。之后,我需要将中间的所有字节替换为FF
字节,包括1A
字节但不包括08
字节,然后从0E
所在的字节顺时针重复此操作。
或者,可以不求距离,而是覆盖所有字节,直到从
08
垂直开始顺时针移动,直到到达 1A
字节。哪种方法更可行?
结果应该是这样的:
00 FF E1 03 04 05
06 FF 08 09 0A 0B
08 FF FF FF FF 08
12 FF FF 15 FF 17
08 FF FF FF FF 1D
1E 1F 20 10 08 23
既然你正在学习,我不会给你完整的解决方案,而是给你一些提示。
您可以使用两个嵌套的 for 循环来查找 1A 值。一个循环在 x 上循环,另一个在 y 上循环。在单独的函数中实现它更容易,因为这样您可以简单地使用
return
语句来停止循环并返回结果。
您可以使用元组返回 x 和 y 索引:
(int x, int y)
。
参见:元组类型(C# 参考)
您需要一种方法来定义四个基本方向。一种可能的方法是在像这样的元组数组中声明移动方向的 delta x 和 y 值(我正在向下定义正 y 方向。如果您以相反的方式执行此操作,则必须更改
dy
的符号):
// up right down left
(int dx, int dy)[] directions = [(0, -1), (1, 0), (0, 1), (-1, 0)];
然后您可以使用模运算符
%
循环方向来限制索引,如下所示
int direction = 0; // upwards
// In the main loop
(int dx, int dy) = directions[direction];
direction = (direction + 1) % 4;
您可以在主循环中使用此代码来确定方向,并使用嵌套的内循环来执行直线移动。
当到达边界或 08 时,内部循环结束。
当到达边界时(即 x 为 0 或 3 && y 为 0 或 3),主循环结束。