いろいろ備忘録日記

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

Linq入門記-22 (LINQ To Object, Select)


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


このメソッドも、クエリ式でおなじみなので
特に特記することはありませんw


Select拡張メソッドは、2つのオーバーロードを持っており
以下の書式となっています。

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, TResult> selector
)
public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, int, TResult> selector
)


よく利用するのは、一つ目の方ですね。
2つ目の方は、selectorの引数が一つ増えています。
このint型の引数には、該当データのシーケンス内でのインデックス値が
渡されます。


処理によっては、インデックス値が必要な場合もありますので、その時に
このオーバーロードを利用します。


以下、サンプルです。

    #region LinqSamples-20
    public class LinqSamples20 : IExecutable
    {
        class Person
        {
            public int    Id   { get; set; }
            public string Name { get; set; }
        }

        public void Execute()
        {
            var persons = new List<Person>
            {
                 new Person { Id = 1, Name = "gsf_zero1" }
                ,new Person { Id = 2, Name = "gsf_zero2" }
                ,new Person { Id = 3, Name = "gsf_zero3" }
            };
            
            //
            // Select拡張メソッドを利用。
            //   クエリ式で利用しているselect句と利用方法は同じ。
            //   select拡張メソッドは、2つのオーバーロードをもっており
            //
            //   一つは、Func<TSource, TResult>のタイプ。もう一つは、Func<TSource, int, TResult>のタイプとなる。
            //   2つ目のタイプの場合、その時のインデックスが引数として設定される。
            //
            Console.WriteLine("===== Func<TSource, TResult>のタイプ =====");
            foreach (var name in persons.Select(item => item.Name))
            {
                Console.WriteLine("NAME={0}", name);
            }
            
            Console.WriteLine("===== Func<TSource, int, TResult>のタイプ =====");
            foreach (var name in persons.Select((item, index) => string.Format("{0}_{1}", item.Name, index)))
            {
                Console.WriteLine("NAME={0}", name);
            }
        }
    }
    #endregion


出力結果は、以下のようになります。

  ===== Funcのタイプ =====
  NAME=gsf_zero1
  NAME=gsf_zero2
  NAME=gsf_zero3
  ===== Funcのタイプ =====
  NAME=gsf_zero1_0
  NAME=gsf_zero2_1
  NAME=gsf_zero3_2