填充嵌套列表

时间:2013-03-28 00:51:53

标签: c# winforms visual-studio-2010 arraylist

我有一个生成按钮网格的程序,我想将这些按钮存储在嵌套数组列表中,但我正在做的方式似乎不正确

这是我的代码:

        List<List<Button>> buttonsList = new List<List<Button>>();
        List<Button[]> rowList = new List<Button[]>();

        //Some method that creates a grid of buttons
        buttons = new Button[row][];
        for (int r = 0; r < row; r++)
        { 
            buttons[r] = new Button[col];
            buttonsList.Add(rowList[r]);    
            for (int c = 0; c < col; c++)
            {
                buttons[r][c] = new Button();
                rowList[c].Add(buttons[r][c]);
            }
        }

1 个答案:

答案 0 :(得分:3)

首先需要了解的是List<T>T[]不等同*(*见脚注)。您的代码似乎希望将列表视为一个数组,而这只是不起作用。

List<List<Button>>可以按以下方式使用:

var listOfLists = new List<List<Button>>();
var listOfButtons = new List<Button>();
listOfButtons.Add(new Button());
listOfLists.Add(listOfButtons); 

您可以继续向按钮列表添加按钮,创建更多按钮列表,向这些按钮添加按钮,并将所有按钮添加到列表列表中,您可以在循环或嵌套循环中完成所有这些操作。 / p>

对数组Button[][]的处理方式不同。它不是动态大小的,而是以不同的方式使用。

var arrayOfArrays = new Button[10][];
var arrayOfButtons = new Button[3];
arrayOfButtons[0] = new Button();
arrayOfButtons[1] = new Button();
arrayOfButtons[2] = new Button();
arrayOfArrays[0] = arrayOfButtons;

然后你还可以设置9个按钮阵列(在本例中)。

您的代码会尝试将一组按钮添加到列表中,以获得按钮列表。还有一些其他项目需要排序,但基本的想法是你正在混合这两个不同的集合,编译器正在大声抱怨。

要修复代码,首先要使用适当的类型来完成您需要做的事情,然后在逻辑中始终正确地使用这些类型。

作为首发,请了解这些代码段的详细信息。

// using List<List<Button>>

var buttonLists = new List<List<Button>>();

for (int r = 0; r < row; r++)
{ 
    var buttonRow = new List<Button>();
    buttonLists.Add(buttonRow);    
    for (int c = 0; c < col; c++)
    {
        buttonRow.Add(new Button());
    }
}

// using Button[][]

var buttonArrays = new Button[row][];

for (int r = 0; r < row; r++)
{
    buttonArrays[r] = new Button[col];
    for (int c = 0; c < col; c++)
    {
        buttonArrays[r][c] = new Button();
    }
}

*除非您通过通用接口类型引用它们,在这种情况下它们仍然不等同但是兼容,但这超出了本答案的范围,并且在这方面没有特别用处上下文,给出了涉及的代码片段。