在C#中的二维数组

3
第二维是否可以初始化为动态可调大小?

你的意思是第一维的每个实例都不同?就像一个可变长度向量的数组? - n8wrl
可能是这个问题的重复:https://dev59.com/TkXRa4cB1Zd3GeqPoxjd - Dan J
@djacobson:投票重复自动发布评论。 - BoltClock
@BoltClock 我也是这么想的,但我没有立即看到它发生,所以我发了自己的评论。重复的重复评论已被删除。 :) - Dan J
5个回答

6

不行(因为C#数组的维度是固定的),但是你可以创建一个List<T>数组。


谢谢。我想我本来就是想问关于不规则数组的问题。那么,我该如何初始化一个包含ArrayList()或List<>作为第二个元素的不规则数组呢?非常感谢您的帮助。请随意使用答案区域: - user225626

4
你是指不规则数组吗?像这样:

你的意思是不规则数组吗?像这样:

class Program
{
  public int[][] jaggedArray = {
                                 new int[]{ 1 } ,
                                 new int[]{} ,
                                 new int[]{ 1 , 2 , 3 } ,
                               } ;
}

1

通常,一个锯齿数组都有一个大小。你可以使用两个集合:

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

您可以像访问任何数组一样访问这些值。优点是在创建时不需要指定大小。

编辑:如果“外部”数组是固定的,您可以使用:

List<int>[] list = new List<int>[100]();

编辑:根据你的示例,我认为这样做可能会有所帮助:

List<int>[] sVertRange = new List<int>[924];

int nH = 0;
for (int h = 315; h < 1240; h++) 
{
    for (int v = 211; v <= 660; v++) 
    {
            Color c = bmp.GetPixel(h, v);
            if (c.R > 220 && c.G < 153) 
        {
            if(sVertRange[nH] == null)
            {
                sVertRange[nH] = new List<int>();
            }

                    sVertRange[nH].Add(v);
            }
            nH++;
        }
}

根据你的伪代码,我会建议你需要类似于 List<int>[] = new List<int>924; 的东西。 - Kees C. Bakker
谢谢。因为我是个新手,所以我选择了另一个看起来更容易编写的选项,现在我已经编写和编译了一些内容,并将进行测试(可能在几分钟或几小时内)。如果那不起作用,我会快速回到这个选项。再次感谢您的回答和帮助。编辑:Kees,因为您可能在附近,我将在其他配置中发布我刚刚编写的内容(尚未测试),并请问您是否可以编辑我的代码片段,以便使用相同语法编写您的代码。如果您愿意的话。谢谢。 - user225626
你需要检查List<int>是否已经初始化。你将从<null>值开始。如果你正在处理图像,最好继续使用jagged数组。尽量避免使用ArrayList,因为List<int>以更有效的方式存储值。 - Kees C. Bakker
初始化行出现错误“需要方法名”。new List<int>[924]在蓝色波浪线下被标记。 - user225626
非常感谢您的帮助!我非常感激。仍然无法解决“需要方法名称”的问题。(如果我再也没有收到您的消息,再次感谢您;由于您慷慨的帮助,我已经比以前进步了很多。) - user225626
显示剩余2条评论

0

更新:我刚刚测试了一下,它不起作用——它会立即崩溃。那么以下内容如何使用Kees的语法编写?

    int[][] sVertRange = {new int[924] ,new int[]{}};  
    int nH = 0;
    int nV = 0;
    for (int h = 315; h < 1240; h++) {
        for (int v = 211; v <= 660; v++) {
            Color c = bmp.GetPixel(h, v);
            if (c.R > 220 && c.G < 153) {
                sVertRange[nH][nV++] = v;
            }
        nH++;
        }
    }

嗯...你想要实现什么?我是说在功能上... 你是想裁剪位图的一部分还是其他什么吗? - Kees C. Bakker
哦,你的代码不起作用,因为你缺少对nV变量的重置。我认为当你执行nH++时,你可能也应该执行nV = 0。 - Kees C. Bakker
nV = 0 是个好的发现,谢谢。至于另一行代码,sVertRange[nH].Add(v); 无法编译通过。我不知道该怎么办。如果你认为你的 List 可能有用,我完全不知道如何组合它。 - user225626
我在关注你楼上的帖子。非常感谢你写下这篇文章。初始化行仍然出现“需要方法名称”的错误,但是真的很感谢你提供的代码片段。我从来没有想过它是如何组合在一起的。 - user225626
这最终起作用了。我没有将必要的数组元素重置为零并再次重置为零。再次感谢。 - user225626
显示剩余2条评论

0

如果你想在C#中创建二维数组,每个元素类型是位图

int num1 = 10,num2 = 20;
Bitmap[][] matrix= new Bitmap[num1][]; 
for (int i = 0; i < num1; i++ )
     matrix[i] = new Bitmap[num2];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接