for WPF developers
Home Profile Tips 全記事一覧

SkipWhile 拡張メソッドで条件にしたがって連続する先頭要素を除外する

(2017/03/14 10:52:59 created.)

SkipWhile 拡張メソッドは、Skip 拡張メソッドと同様に先頭要素を除外します。その除外方法は、先頭要素から順に入力引数で指定するメソッドを評価し、その結果が false となる要素になるまでの要素を除外するという方法です。

Program.cs
  1. namespace Tips_Linq
  2. {
  3.     using System;
  4.     using System.Linq;
  5.  
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             var numbers = new int[] { 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 };
  11.             Console.WriteLine(string.Join(", ", numbers));
  12.             Console.WriteLine("------------");
  13.  
  14.             var numbers2 = numbers.SkipWhile(x => x < 4);
  15.             Console.WriteLine(string.Join(", ", numbers2));
  16.             Console.WriteLine("------------");
  17.  
  18.             var numbers3 = numbers.SkipWhile((x, i) => i < 4);
  19.             Console.WriteLine(string.Join(", ", numbers3));
  20.  
  21.             Console.ReadKey();
  22.         }
  23.     }
  24. }


サンプルコードでは、1 から 5 の整数を順に繰り返し並べたシーケンスに対してSkipWhile 拡張メソッドを使用しています。1 回目は入力引数に 4 未満であるかどうかという条件を指定しているため、先頭要素から順に 4 未満である要素が除外されています。ただし、一度条件を満たさない要素が出現した場合は以降の要素すべてを含むシーケンスを生成するため、途中の 4 未満である要素は除外されません。

2 回目の SkipWhile 拡張メソッドでは入力引数を Func<TSource, bool> ではなく、Func<TSource, int, bool> という 2 つの入力引数を持つデリゲートを指定しています。2 つ目の入力引数は要素のインデックスを表す整数になります。サンプルコードではこのインデックスが 4 未満であるかどうかを条件としているため、ちょうど Skip 拡張メソッドに 4 を指定した場合と同じ結果が得られています。