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(●●)なら●●の間スキップするとそのまま読めるので助かります。

では。