いろいろ備忘録日記

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

Linq入門記-46 (LINQ To Object, Take, TakeWhile)

今回は、Take拡張メソッドとTakeWhile拡張メソッドについてです。


Take拡張メソッドは、指定された件数分シーケンスから要素を返します。
TakeWhile拡張メソッドは、指定された条件が満たされる間要素を返します。


Take拡張メソッドは、よくトップNを抽出する際に使われます。
シーケンスの要素数以上の数を指定しても、例外は発生しません。
空のシーケンスが返されます。


書式は以下の通り。

public static IEnumerable<TSource> Take<TSource>(
	this IEnumerable<TSource> source,
	int count
)

public static IEnumerable<TSource> TakeWhile<TSource>(
	this IEnumerable<TSource> source,
	Func<TSource, bool> predicate
)

public static IEnumerable<TSource> TakeWhile<TSource>(
	this IEnumerable<TSource> source,
	Func<TSource, int, bool> predicate
)

TakeWhileの2つ目の書式は、predicateに要素のインデックスが追加されます。
インデックス値が必要な場合はこちらを使います。


以下、サンプルです。

    #region LinqSamples-43
    public class LinqSamples43 : IExecutable
    {
        public void Execute()
        {
            //
            // Take拡張メソッドは、シーケンスの先頭から指定された件数分を返すメソッド。
            //
            //   ・シーケンスの要素数より多い数を指定した場合、そのシーケンス全てが返る.
            //   ・0以下の値を指定した場合、空のシーケンスが返る.
            //
            var names = new string[] { "gsf_zero1", "gsf_zero2", "gsf_zero3", "gsf_zero4", "gsf_zero5" };
            
            Console.WriteLine("================ Take ======================");
            var top3 = names.Take(3);
            foreach (var item in top3)
            {
                Console.WriteLine(item);
            }
            
            foreach (var item in names.Take(20))
            {
                Console.WriteLine(item);
            }
            
            Console.WriteLine("0以下の数値を指定: COUNT={0}", names.Take(-1).Count());
            
            //
            // TakeWhile拡張メソッドは、指定された条件が満たされる間シーケンスから要素を抽出し
            // 返すメソッド。
            //
            Console.WriteLine("================ TakeWhile ======================");
            var lessThan4 = names.TakeWhile(name => int.Parse(name.Last().ToString()) <= 4);
            foreach (var item in lessThan4)
            {
                Console.WriteLine(item);
            }
        }
    }
    #endregion


実行結果は以下の通りです。

  ================ Take ======================
  gsf_zero1
  gsf_zero2
  gsf_zero3
  gsf_zero1
  gsf_zero2
  gsf_zero3
  gsf_zero4
  gsf_zero5
  0以下の数値を指定: COUNT=0
  ================ TakeWhile ======================
  gsf_zero1
  gsf_zero2
  gsf_zero3
  gsf_zero4

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