2011-09-22 17 views
3

私の脳が機能していない、私はこのグリッド上の最初の3つの行をつかむしようとしています。私はいくつかの新しいものを学ぶために簡単なチェッカーゲームを作っています。私のコードは最初の3つの列をつかんで赤いチェスの配置を初期化しています。私は最初の3行を代わりにしたい。ギザギザの配列の最初の3つの要素を取得する

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

enter image description here

これは私の(簡体字)のコードです。 Squareは、いくつかの小さなアイテムを保持しているだけの鉱山のクラスです。その後、enumerablesとしてあなたが行(または列)を取得したい場合は

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

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); 
    } 
+0

タイトルに「C#LINQ」というプレフィックスを付けないでください。それはすでにタグに入っています。 –

+0

@ John Saunders、私はどちらの方法でも強い意見はありませんが、質問タイトルのリストを書き留めていれば精神的に分かりやすくなりますか? –

+1

[so]にいる人は、タグを使って質問のリストをフィルタリングするのに慣れているので、そうではありません。それはちょうど質問タイトルを醜く読めないようにする。 "C#LINQは、ギザギザの配列の最初の3つの要素を得る"対 "ギザギザの配列の最初の3つの要素を取得する"という、自分自身に読んでください。どちらが理にかなって、その質問についてあなたに何かを教えてくれるのですか。 –

答えて

3

あなたは、これはあなたの最初の3行を与える必要があり、最初の3つの列を取得するためにm_board.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]; 
+0

ありがとうございました、私は私が近くにあって正解を踊っていることを知っていました。 –

+0

また、前に.ToLookup()を使用したこともありません。もしあなたが2回あなたの投票をすることができたら、私はそうするでしょう。 –

+0

@jb。 - はい、 '.ToLookup()'はとても素晴らしいです。乾杯。 – Enigmativity

関連する問題