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