如何在数组中设置列表

时间:2013-03-10 11:11:50

标签: c# arrays list multidimensional-array

我发起了一个多维数组:

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

对于具有现有网格的每个单元格,我想保留带有一些值的字节列表。

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

修改:在此处提供一些背景信息。我正在制作一个由多维数组表示的数独游戏。由于我想以编程方式解决数独并且我使用回溯算法,我需要记住每个单元格无效的数字。

因此每个单元格应包含一个值和一个List。我可能只是将实际字段作为列表中的第一个值。但永远不知道是否有一个真正的清洁解决方案:)

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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;

        }