【问题标题】:How to create a 2D array of unknown length in C#?如何在 C# 中创建一个未知长度的二维数组?
【发布时间】:2016-04-16 17:32:22
【问题描述】:

所以我需要存储如下所示的数据:

map[x,y] = z;
map[1,3] = 5;
map[2,6] = 8;

问题是 x 和 y 的长度未知。我假设我需要 List 或 Dictionary 之类的东西,但我不确定是哪一个或如何实现它(添加并从中获取值)。

【问题讨论】:

  • 他们将这些信息隐藏在MSDN
  • 永远未知长度,还是仅在您开始时?你认为这里人口稠密吗?会有多大?从根本上说,您可以使用Dictionary<Tuple<int, int>, int>,但这可能效率很低。
  • 数据真的和你的例子一样稀疏吗?到目前为止,您有一个具有 2 个值的 2x6 矩阵。如果是这样,我会查找 C# 稀疏矩阵,看看你得到了什么。如果 x 和 y 在运行时可能非常大,这一点尤其重要,如果使用完整的数组实现,您将耗尽内存。
  • 是否需要将其存储在数组或给定类型的多维列表/数组中。还是仅仅是添加、查找和删除的要求。是否有某种特殊的运行时要求。如果不是,我只会创建一个托管字典类。

标签: c# arrays list dictionary


【解决方案1】:

二维列表的声明和初始化:

List<List<int>> list2D = new List<List<int>>();

添加到第一个维度(整数列表):

list2D.Add(new List<int>());

添加到列表的第二维(第一维的索引和您添加的整数值):

list2D[0].Add(123);

这是关于 List 对象的 MSDN 文章:

https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx

【讨论】:

    【解决方案2】:

    公共对象 this[int x, int y] { get;放; }

    对我来说,这是在 C# 6 或更高版本中使用的最简单的选项,因为一旦创建了类,我就不必初始化或创建子集合。

    class Program
    {
        static void Main(string[] args)
        {
            var array = new Matrix();
            array[1,0] = "cat";
            array[0,1]="dog";
            Console.WriteLine(array[0, 1]);
            array[0, 1] = null;
        }
    }
    
    class Matrix
    {
        private Dictionary<string,Object> Data = new Dictionary<string,object>();
        public object this[int x, int y]
        {
            get
            {
                string key = this.GetKey(x, y);
                return Data.ContainsKey(key) ? Data[key] : null;
            }
            set
            {
                string key = this.GetKey(x, y);
                if(value==null)
                    Data.Remove(key);
                else
                    Data[key] = value;
            }
        }
        private string GetKey(int x, int y)
        {
            return String.Join(",", new[] { x, y });
        }
    }
    

    【讨论】:

    • 谢谢!这正是我想要的方式。我必须进行一些更改,以便它返回 int 而不是 object,但感谢您朝着正确的方向推动!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多