今回は、Skip拡張メソッドとSkipWhile拡張メソッドについてです。
TakeとTakeWhileが先頭から指定された分要素を返すのに対して、
こちらは指定された分要素をスキップしてくれます。
Skip拡張メソッドは、指定された件数分シーケンスの要素をスキップします。。
SkipWhile拡張メソッドは、指定された条件が満たされる間要素をスキップします。
個人的には、SkipWhileの方がよく利用しますね。
シーケンスの中から、処理済み状態のオブジェクトをスキップさせたり。
書式は以下の通り。
public static IEnumerable<TSource> Skip<TSource>( this IEnumerable<TSource> source, int count ) public static IEnumerable<TSource> SkipWhile<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate ) public static IEnumerable<TSource> SkipWhile<TSource>( this IEnumerable<TSource> source, Func<TSource, int, bool> predicate )
SkipWhileの2つ目の書式は、predicateに要素のインデックスが追加されます。
インデックス値が必要な場合はこちらを使います。
以下、サンプルです。
#region LinqSamples-44 public class LinqSamples44 : IExecutable { public void Execute() { // // Skip拡張メソッドは、シーケンスの先頭から指定された件数分をスキップするメソッド。 // // ・シーケンスの要素数より多い数を指定した場合、空のシーケンスが返る. // ・0以下の値を指定した場合、シーケンスの全ての要素が返る. // var names = new string[] { "gsf_zero1", "gsf_zero2", "gsf_zero3", "gsf_zero4", "gsf_zero5" }; Console.WriteLine("================ Skip ==========================="); var last2Elements = names.Skip(3); foreach (var item in last2Elements) { Console.WriteLine(item); } Console.WriteLine("シーケンスの要素数以上の数を指定: COUNT={0}", names.Skip(20).Count()); foreach (var item in names.Skip(-1)) { Console.WriteLine(item); } // // SkipWhile拡張メソッドは、指定された条件が満たされる間シーケンスから要素を抽出し // 返すメソッド。 // Console.WriteLine("================ SkipWhile ======================"); var greaterThan4 = names.SkipWhile(name => int.Parse(name.Last().ToString()) <= 3); foreach (var item in greaterThan4) { Console.WriteLine(item); } } } #endregion
実行結果は以下の通りです。
================ Skip =========================== gsf_zero4 gsf_zero5 シーケンスの要素数以上の数を指定: COUNT=0 gsf_zero1 gsf_zero2 gsf_zero3 gsf_zero4 gsf_zero5 ================ SkipWhile ====================== gsf_zero4 gsf_zero5
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ