在C#中更好地实现2D动态数组类容器

时间:2014-09-15 18:17:26

标签: c#

我必须为我的计算模型定义一个数据结构,作为2D数组。可以猜测,首先要关注的是初始化,迭代等方面的性能。 我对以上要求有以下想法:

IList<IList<MyClass>>

IList<MyClass> [,]

我很容易知道两个提到的选项之间的技术差异。此外,有人可能试图说服我,以便选择更好的...

1 个答案:

答案 0 :(得分:1)

鉴于您实际上需要没有固定维度的地图,最好使用词典作为基础数据类型,这样您就不必花太多时间考虑调整大小。

因此你可以使用这样的结构:

class Map<T>
{
    Dictionary<int, Dictionary<int, T>> map = 
         new Dictionary<int, Dictionary<int, T>>();
    public T this[int row,int column]
    {
        get { 
            Dictionary<int, T> rowDic;
            if(!map.TryGetValue(row,out rowDic))
            {
                return default(T);
            }
            T val;
            if(!rowDic.TryGetValue(column, out val))
            {
                return default(T);
            }
            return val;
        }
        set {
            Dictionary<int, T> rowDic;
            if(!map.TryGetValue(row,out rowDic))
            {
                map[row] = new Dictionary<int, T>();
            }
            map[row][column] = value;
        }
    }
}

所以现在你可以像二维数组一样使用它:

var map = new Map<string>();
map[88,33] = "foo";
相关问题