初めに
更新の頻度を聞かれると微妙ではありますが、MSのチュートリアルって勉強になるなと感じているので紹介します。
テーマは表題通り、トランプの実装です。
https://docs.microsoft.com/ja-jp/dotnet/csharp/tutorials/working-with-linq
トランプの生成
まず、トランプを生成する元となる列挙型的な物の準備から。
題材となるコードはチュートリアルに乗っ取るため、各々突っ込みどころはあると思いますが(Enumを使わないから適切な条件分岐書けなそう・Rankは数字で持ちたい等)、一旦LINQの使い方を学ぶという事で置いておきましょう。
staticIEnumerable<string>Suits(){yieldreturn"clubs";yieldreturn"diamonds";yieldreturn"hearts";yieldreturn"spades";}staticIEnumerable<string>Ranks(){yieldreturn"two";yieldreturn"three";yieldreturn"four";yieldreturn"five";yieldreturn"six";yieldreturn"seven";yieldreturn"eight";yieldreturn"nine";yieldreturn"ten";yieldreturn"jack";yieldreturn"queen";yieldreturn"king";yieldreturn"ace";}
yield returnの挙動が分からない場合は、公式より以下の記事の様な個人ブログの方が馴染みやすいのでおすすめです。
https://tyheeeee.hateblo.jp/entry/2013/08/07/C%23%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Byield_return%E3%81%AE%E6%8C%99%E5%8B%95#fn-3dffedb5
この二つを利用して、トランプを生成してくださいと言われたら、あなたならどう書きますか?
LINQを使わない例がこちら。
※Trumpクラスの実装は割愛します。
varstartingDeckNoLINQ=newList<Trump>();foreach(varsuitinSuits()){foreach(varrankinRanks()){startingDeckNoLINQ.Add(newTrump(){Suit=suit,Rank=rank});}}
単純な二重for文です。ここにLINQを使う場合はどう書けば良いでしょうか?
LINQを覚えたての人向けの書き方がこちら。
varstartingDeckHalfLINQ=newList<Trump>();foreach(varsuitinSuits()){startingDeckHalfLINQ.AddRange(Ranks().Select(rank=>newTrump(){Suit=suit,Rank=rank}));}
トランプのマークだけFor文で回して、数字をSelectで回すパターン。
これであれば、デバッグする時にマーク毎に実行されるので追いやすいですね。
最後に、for文なしの書き方です。
varstartingDeckAllLINQ=Suits().SelectMany(suit=>Ranks().Select(rank=>newTrump(){Suit=suit,Rank=rank}));
慣れるまで頭が混乱してしまいますが、SelectManyを利用すれば複数の列挙データを組み合わせたデータを一度に作成する事が出来ます!!
SelectManyについて詳しく知りたい方は以下などを参考にしてください。
https://ufcpp.net/study/csharp/sp3_stdquery.html
今回の内容は以上です。
次回はシャッフルの実装についてまとめます。