3

脳が機能していません。このグリッドの最初の 3 行を取得しようとしています。新しいことを学ぶためだけに、単純なチェッカー ゲームを作成しています。私のコードは、最初の 3 つの列を取得して、赤いチェスの駒の配置を初期化しています。代わりに最初の 3 行が必要です。

これは私のコードが今行っていることです:

ここに画像の説明を入力

これは私の(簡略化された)コードです。Squareは、ピースを追跡するためにいくつかの小さなアイテムを保持するだけの私のクラスです。

    private Square[][] m_board = new Square[8][];
    for (int i = 0; i < m_board.Length; i++)
        m_board[i] = new Square[8];


//find which pieces should hold red pieces, the problem line
    IEnumerable<Square> seqRedSquares = 
         m_board.Take(3).SelectMany(x => x).Where(x => x != null);
//second attempt with the same result
    //IEnumerable<Square> seqRedSquares = 
         m_board[0].Union(m_board[1]).Union(m_board[2]).Where(x => x != null);

//display the pieces, all works fine
    foreach (Square redSquare in seqRedSquares)
    {
        Piece piece = new Piece(redSquare.Location, Piece.Color.Red);
        m_listPieces.Add(piece);
        redSquare.Update(piece);
    }
4

1 に答える 1

3

最初の3列を取得するために使用m_board.Take(3)している場合、これにより最初の3行が得られます。

 m_board.Select(c => c.Take(3))

行(または列)を列挙可能として取得する場合は、次のようにします。

var flattened = m_board
    .SelectMany((ss, c) =>
        ss.Select((s, r) =>
            new { s, c, r }))
    .ToArray();

var columns = flattened
    .ToLookup(x => x.c, x => x.s);

var rows = flattened
    .ToLookup(x => x.r, x => x.s);

var firstColumn = columns[0];
var thirdRow = rows[2];
于 2011-09-22T02:57:18.413 に答える