いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Linq入門記-47 (LINQ To Object, Skip, SkipWhile)

今回は、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

================================
過去の記事については、以下のページからご参照下さい。