如何在数组中设置列表

本文关键字:设置 列表 数组 | 更新日期: 2023-09-27 18:03:15

我启动了一个多维数组:

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

我想持有一个字节列表与一些值,为现有网格中的每个单元格。

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

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

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

如何在数组中设置列表

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();

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

  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;
        }