如何在c#中声明一个自由长度的2d数组

时间:2013-06-25 07:47:51

标签: c# multidimensional-array

美好的一天,

通常我按如下方式创建2D数组:

string [,] arr = new string [9,4];

这是一个包含9行和4列的2D数组。

我想问一下,如何创建任意长度的2D数组。 例如,将行设置为9并不是必须的,它可以是任何数字,具体取决于具体情况。

3 个答案:

答案 0 :(得分:4)

简单List<List<T>>怎么样?

这就像一个概念,您自然可以在自定义类中包含它,因此您的API的使用者不会看到这些嵌套的声明。

public class Matrix {

   private mtx = new List<List<T>>(); 


   public void Append(T value) {
      .....
   }  

   public void InsertAt(T value, int row, int column) {
      ....
   }

}

答案 1 :(得分:2)

为此您必须使用List<List<string>>实例。现在你可以动态添加你想要的任何东西了,但是如果你已经达到最大行数或列数,那么你需要自己检查的数组格式也有缺点。

答案 2 :(得分:0)

这个Matrix类是空间(基于访问模式)和性能效率:

class Matrix<T>
{
    readonly Dictionary<int, Dictionary<int, T>> _rows = new Dictionary<int, Dictionary<int, T>>();

    public T this[int i, int j]
    {
        get
        {
            var row = ExpandOrGet(j);
            if (!row.ContainsKey(i)) row[i] = default(T);

            UpdateSize(i, j);

            return row[i];
        }
        set
        {
            ExpandOrGet(j);
            _rows[j][i] = value;

            UpdateSize(i, j);
        }
    }

    void UpdateSize(int i, int j)
    {
        if (j > SizeRows) SizeRows = j;
        if (i > SizeColums) SizeColums = i;
    }

    public int SizeRows { get; private set; }
    public int SizeColums { get; private set; }

    Dictionary<int, T> ExpandOrGet(int j)
    {
        Dictionary<int, T> result = null;

        if (!_rows.ContainsKey(j))
        {
            result = new Dictionary<int, T>();
            _rows[j] = result;
        }
        else result = _rows[j];

        return result;
    }
}

虽然您可以添加更多实用程序以方便您的工作流程。