0

我启动了一个多维数组:

private byte[,] grid = new byte[9, 9];

我想为现有网格中的每个单元格保存一个包含一些值的字节列表。

我知道 3 维数组在这里会很方便。但是由于具有无效值的列表是动态的,我想使用列表而不是数组。

编辑:在这里给出一些上下文。我正在制作一个数独,它由一个多维数组表示。由于我想以编程方式解决数独问题并且我使用的是回溯算法,因此我需要记住对每个单元格无效的数字。

所以每个单元格应该由一个值和一个列表组成。我可能只是将实际字段作为列表中的第一个值。但永远不知道是否有真正干净的解决方案:)

4

2 回答 2

1
var grid = new List<byte>[9,9];

for (int i = 0; i < 9; i++)
    for (int j = 0; j < 9; j++)
        grid[i, j] = new List<byte>();

之后 9x9 数组的每个项目都包含一个空的List<byte>.

但是,我建议创建一个像Field

public class Field
{
    public byte Value { get; set; }
    public List<byte> List { get; set; }

    public Field()
    {
        List = new List<byte>();
    }
}

并使用它而不是仅仅List<byte>

var grid = new Field[9, 9];

for (int i = 0; i < 9; i++)
    for (int j = 0; j < 9; j++)
        grid[i, j] = new Field();
于 2013-03-10T11:18:05.653 回答
0

如果我理解正确,您需要列表中的字节列表吗?试试这个:

  List<List<byte>> listOfBytesInList = new List<List<byte>>();

更新

您可以实现一个使用内部字节列表的自己的类。我为时已晚,但无论如何我都会发布我的解决方案。

 public class ByteFieldList
    {
        private readonly List<byte> _interalBytes;

        public ByteFieldList()
            : this(4, 0)
        {
        }

        public ByteFieldList(byte fieldValue)
            : this(4, fieldValue)
        {
        }


        public ByteFieldList(int capacity, byte fieldValue)
        {
            FieldValue = fieldValue;
            _interalBytes = new List<byte>(capacity);
        }


        public byte FieldValue { get; set; }

        public ByteFieldList Add(byte b)
        {
            _interalBytes.Add(b);
            return this;
        }

        public void AddRange(byte[] bytes)
        {
            foreach (var b in bytes)
                Add(b);
        }


        public ByteFieldList Remove(byte b)
        {
            _interalBytes.Remove(b);
            return this;
        }

        public byte this[int index]
        {
            get { return _interalBytes[index]; }
        }

        public byte[] GetAllInvalid()
        {
            return _interalBytes.ToArray();
        }   

    }


  public void Usage()
        {
            ByteFieldList byteFieldList = new ByteFieldList(5);

            byteFieldList.Add(5).Add(4).Add(8);
            byteFieldList.AddRange(new byte[] { 7, 89, 4, 32, 1 });

            var invalids = byteFieldList.GetAllInvalid(); // get 5, 4, 8, 7, 89, 4, 32, 1

            byteFieldList.FieldValue = 4;

        }
于 2013-03-10T11:15:37.503 回答