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

本文关键字:动态 数组 2D 实现 更好 | 更新日期: 2023-09-27 18:22:00

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

IList<IList<MyClass>>

IList<MyClass> [,]

我很容易知道上述两种选择之间的技术差异。此外,有人可能会试图说服我,以便在更好的选择中做出选择。。。

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

考虑到您实际上需要一个没有固定维度的映射,最好使用字典作为底层数据类型,这样您就不需要花太多时间考虑调整大小。

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

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

所以现在你可以像使用2d阵列一样使用它:

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