我认为解决方案是使用稀疏数组。使用Dictionary<int,PCE> 存储每个对象及其位置。所以如果板子是N×N来指定[i,j]位置使用key:i*N+j。
请看下面的例子:
public class PCE { }
public class Board
{
readonly int size;
readonly Dictionary<int, PCE> pieces;
public Board(int size)
{
this.size=size;
pieces=new Dictionary<int, PCE>();
}
public int Size { get { return size; } }
public int GetKeyFromPosition(int i, int j) { return size*i+j; }
public void GetPositionFromKey(int key, out int i, out int j)
{
i=key/size;
j=key%size;
}
public void PlacePCE(int i, int j, PCE item)
{
pieces[size*i+j]=item;
}
public PCE GetPCE(int i, int j)
{
if (pieces.ContainsKey(size*i+j))
{
return pieces[size*i+j];
}
return null;
}
public PCE this[int i, int j]
{
get { return GetPCE(i, j); }
set { PlacePCE(i, j, value); }
}
public bool IsLocationFilled(int i, int j)
{
return pieces.ContainsKey(size*i+j);
}
public List<KeyValuePair<int, PCE>> Pieces
{
get
{
return pieces.ToList();
}
}
}
class Program
{
static void Main(string[] args)
{
Board board=new Board(64);
board.PlacePCE(4, 7, new PCE());
board.PlacePCE(11, 2, new PCE());
board.PlacePCE(2, 47, new PCE());
board.PlacePCE(51, 37, new PCE());
if (board.IsLocationFilled(2, 47))
{
var pce=board[2, 47];
}
// Non-nulls only. Iterates over 4 items only
foreach (var item in board.Pieces)
{
int i, j;
board.GetPosition(item.Key, out i, out j);
PCE pce=item.Value;
// Do something with [i,j] PCE
}
}
}
特点:
- 可变板尺寸(您需要在构造函数中为
Board 设置限制)
-
GetKeyFromPosition 和 GetPositionFromKey 在二维坐标之间转换为一维唯一键位置(并返回)。
-
PlacePCE 和 GetPCE 在板位置设置 PCE 类型(或检索它)。 this[int i, int j] 也可以这样做,因此您可以使用 Board[,] 索引
-
IsLocationFilled 检查位置是否已包含项目
-
Pieces 通过KeyValuePair 返回板上项目的列表。对键是位置索引,值是PCE 实例。