for WPF developers
Home Profile Tips 全記事一覧

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

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

TakeWhile 拡張メソッドは、Take 拡張メソッドと同様に先頭要素を抽出します。その抽出方法は、先頭要素から順に入力引数で指定するメソッドを評価し、その結果が 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.TakeWhile(x => x < 4);
  15.             Console.WriteLine(string.Join(", ", numbers2));
  16.             Console.WriteLine("------------");
  17.  
  18.             var numbers3 = numbers.TakeWhile((x, i) => i < 4);
  19.             Console.WriteLine(string.Join(", ", numbers3));
  20.  
  21.             Console.ReadKey();
  22.         }
  23.     }
  24. }


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

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