0

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

这是我的代码:

        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]);
            }
        }
4

1 回答 1

3

您需要了解的第一件事是 aList<T>和 aT[]不等价*(*见脚注)。您的代码似乎想将列表视为数组,但这行不通。

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

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

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

数组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();
    }
}

*除非您通过通用接口类型引用它们,在这种情况下它们仍然不等效但兼容,但这超出了此答案的范围,并且鉴于所涉及的代码片段,这在此上下文中并不是特别有用。

于 2013-03-28T01:00:36.323 回答