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 に答える