移位数组中对象的属性值

时间:2019-05-12 08:42:56

标签: c# arrays

我目前有一种工作方法,可以移动数组中对象的一个​​属性的值:

    public class Group
    {
        public Position[] Positions { get; private set; }

        public void Shift()
        {
            var last = Positions[Count - 1].Tile;
            for( int i = Count - 1 ; i > 0 ; i-- )
            {
                // Note this shifts Tile value and not the array itself
                Positions[i].Tile = Positions[i - 1].Tile;
            }
            Positions[0].Tile = last;
        }
    }

    public class Position
    {
        // [other properties]

        public Tile Tile { get; set; }
    }

问题在于这种方法需要在算法中运行很多,并且是消耗最多CPU时间的方法。

我正在寻找一种更好的方法来移动这些值,并在以下出色的答案中找到了BlockCopy:https://stackoverflow.com/a/52465132/1554208

但是它用于移动数组本身。有没有一种方法可以复制属性的内容(这里是一个简单的指针)?

我愿意接受:

  • 使用不安全的指针方法
  • 根据需要更改Position类
  • 其他任何建议

编辑

是否可以通过某种方式“计算” Position对象的字节大小,“计算”该对象内Tile属性的地址,并使用类似Buffer.BlockCopy的方式将这些值复制到数组?

1 个答案:

答案 0 :(得分:0)

您可以通过Array.C#复制来解决它

public class Group
{
    public Position[] Positions { get; private set; }

    public void ShiftRight()
    {
        Array.Copy(Positions,0,Positions,1,Positions.Length-1);//Right
        Positions[0].Tile=null;

        Array.Copy(g,1,g,0,g.Length-1);
    }
    public void ShiftLeft()
    { 
        Array.Copy(Positions,1,Positions,0,Positions.Length-1)
        Positions[Positions.Length-1].Tile=null;
    }
}

public class Position
{
    // [other properties]

    public Tile Tile { get; set; }
}