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 つあります (この例では)。

あなたのコードは、ボタンのリストを期待するリストにボタンの配列を追加しようとしています。他にも整理すべき項目がいくつかありますが、基本的な考え方は、これら 2 つの異なるコレクションを混同していて、コンパイラが大声で文句を言っているということです。

コードを修正するには、まず、実行する必要のある適切な型を採用してから、それらの型をロジックで一貫して正しく使用します。

手始めに、これらのスニペットでどこまで到達できるかを確認してください。

// 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 に答える