
SkipWhileメソッドとTakeWhileメソッドの使い方
条件でListの要素を飛ばしたりしたくなることはありませんか。
数を指定して要素を飛ばしたり、取得したりするSkipメソッドとTakeメソッドがあります。
しかし、SkipメソッドとTakeメソッドでは「数」があらかじめわかっていないと使えません。
「数」がわからない状況でつかうには、別のメソッドが必要になります。
そう、SkipWhileとTakeWhileの出番です。
そこで、今回は数が未定でも利用できるSkipWhileメソッドとTakeWhileの使い方と、
使ううえでの混乱対策、使いどころを紹介します。
目次
SkipWhileメソッドとTakeWhileメソッドの使い方
それでは、SkipWhileメソッドとTakeWhileメソッドの使い方を別々にみていきます。
SkipWhileメソッドの使い方
SkipWhileメソッドは条件に一致している間の要素をスキップする機能です。
MSDNのサンプルが回りくどいので、少し単純にして紹介します。
改めてになりますが、一致している間はスキップで、条件に一致しないところから要素を取得します。
一致しないからスキップではないので注意です。
TakeWhileメソッドの使い方
続いてTakeWhileメソッドの使い方。
書き方自体はSkipWhileと変わりませんね。
機能は反転して、TakeWhileメソッドは、条件に一致している間の要素を取得します
動きとしてはfor(each)+if+breakと一緒です。
SkipWhileとTakeWhileの混乱対策
このSkipWhileメソッドとTakeWhileメソッドはしばしば間違われて使われます。
「SkipWhileメソッドとTakeWhileメソッドの使い方」で強調していたところがポイントになります。
間違えて使わないため、今一度確認してみましょう。
True +「~の間」で考えよう
混乱しないためのポイントは
SkipWhileメソッドとTakeWhileメソッドは条件true + 「~の間」で考えよう
です。
true,falseの組み合わせと「~の間」「~まで」を整理すると混乱はなくなります。
SkipWhileを例にとりましょう。
やっていることを日本語で説明すると
- trueの間はスキップ
- falseになるまでスキップ
といえます。
実際に「trueの間は飛ばす」「falseになるまで飛ばす」は同じことを言っているのですけれども、
ここで「~の間」「~まで」の区別をつけていないと、
trueまでスキップするのか、falseの間はスキップするのかと真逆の意味で混乱します。
そこで、True +「~の間」で固定して覚えてしまうのがよいというわけです。
Whileは「~まで」ではなく「~の間」
メソッドを訳せばWhileは「~間」ですね。
英語力がないから混乱するじゃない?
と思われるかもしれませんが、実際は英語圏の人も混乱してます。
これは、同じLinqのSkipメソッドが「~まで」と「~の間」のどちらとも解釈できるので、
混乱の原因になっているかもしれません。
既存コードをSkipWhileメソッドとTakeWhileメソッドに置き換えてみよう
こんなコードを見かけたらSkipWhile・TakeWhileに置き換えるチャンスかもしれません。
見かけたらSkipWhile・TakeWhileへの置き換えを試してみてはいかがでしょうか。
特に、SkipWhileとTakeWhileが混在するようなコードの置き換えの効果は高いです。
SkipWhileの置き換え例
SkipWhileの置き換えポイントはfor(each)+continue+bool+条件のコードが出た時です。
SkipWhileをfor(each)で実装するとちょっと手間になります。
自分でスキップが完了したことを、管理しないといけないのでboolの値(例ではisSkip)が追加で必要になります。
しかし、SkipWhileメソッドを使えば、boolは不要です。
簡単に表現できます。
TakeWhileの置き換え例
続いてTakeWhileの置き換え例をみてみましょう。
こちらは、for(each)+break+条件のコードですね。
このコードをみたら、TakeWhileに置き換えられる可能性が高いです。
ただ、SkipWhileと比べるとそこまでありがたみはないかもしれません。
SkipWhileとTakeWhileの混在の置き換えは可読性向上のメリット大
TakeWhile相当のコードとSkipWhile相当のコードが混在していると
コードは複雑になっていきます。
SkipWhileとTakeWhileを使わずにFor(each)でコードを記述するとなると、ネストも深くなります。
しかし、SkipWhileとTakeWhileを使うとどうでしょう。
かなりシンプルです。
一つのループのなかで「SkipWhileがやっていること」「TakeWhileがやっていること」を
for(each)文でやろうとするとネストが深く可読性が落ちやすいので、
積極的にSkipWhile・TakeWhileを使いたいですね。
まとめ
最後にまとめます。
- SkipWhile・TakeWhileは、「数」ではなく「条件」でスキップと取得ができる
- 「While」は「間」で覚える
- SkipWhile・TakeWhileで記述できるとネストが深くならずに読みやすくなる
Linqメソッドは重ねれば重ねるほど、コードの複雑さが減っていきます。
SkipWhile・TakeWhileも例にもれずだと考えています。
それに、メソッド名で何をしたいかがわかるのがよいですね。
SkipWhile(●●)なら●●の間スキップするとそのまま読めるので助かります。
では。