【趣味】【ゲーム開発】C# LinkedListのイテレーター操作
C#で配列操作と言えばListを想像する人は多いと思う。
だが、C#にはListとは別のアルゴリズムで管理する、
LinkedListという配列がある。
まずはその二つをざっくりと説明しよう。
Listはまっすぐ隙間なくくっついた箱が並んでいるのを想像してほしい。
学校や銭湯の下駄箱のようにきれいなマス目上に並んでいる。
Listが得意なのは、好きな箱を選んで中身を入れたり出したりすること。
学校や銭湯の下駄箱で自分の靴がどこにあるか迷うことはないだろう。
逆に苦手なのは、中身の順番を変えること。
例えば、同級生が一人転校したからと言って、風紀委員であるあなたが、
全員の下駄箱の位置を一つ分詰めることになったと考えてほしい。
非常に面倒くさいことはそれでよく伝わると思う。
対して、LinkedListはばらばらになっている箱を紐か何かで繋いでいるものを想像してほしい。
電車のように連結された箱が並んでいる。
LinkedListが得意なのは中身の順番を変えること。
例えば、電車の2両目が故障したとしても、2両目だけ外して、
1両目と3両目をつなげ直せば終わる。Listでやるような無駄な入れ替え作業はない。
逆に好きな箱を選んで中身を出し入れすることは苦手だ。
例えば、あなたに何かしらの理由で100両編成の電車の
64両目の車両に乗りたい希望があったとする。
でも外から見てぱっと見、目の前にある車両が何両目かわからない。
あなたは前から1つづつ何両目か数える必要がある。面倒くさいでしょ?
…このように、この二つのリストは相反した特徴がある。
なのに、C#ではListの情報ばかりでLinkedListの情報は少ない。
まあ、C#を使える高級な環境なら、LinkedListで追加したり削除したりして、
メモリを節約する必要のある場面が少ないから仕方ないが、俺はむず痒い。
というわけで、ソースを書いた↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// 電車を作る LinkedList<string> train = new LinkedList<string>(); train.AddLast("正常車両"); train.AddLast("正常車両"); train.AddLast("故障車両"); train.AddLast("正常車両"); train.AddLast("故障車両"); train.AddLast("正常車両"); train.AddLast("正常車両"); // 点検のため、最初の車両を見る。 LinkedListNode<string> check = train.First; // チェックする車両がなくなるまで点検する while (check != null) { // 正常車両なので、次の車両を点検しに行く if (check.Value == "正常車両") { check = check.Next; } // 故障車両なので、前の車両に戻って連結を解除する if (check.Value == "故障車両") { var malfunction = check; check = check.Previous; train.Remove(malfunction); } } |
今日は仕事中にこのネタをブログに残そうと決められたので、
予定より早くブログを残せてよく寝られそうだ。
明日のネタも決まっているので安心。
最近電車移動中ドット絵描けてないし、
明後日までにはなんか描いてネタを決めておこう。
…マップチップとかどうだろうか。