今回は、Where拡張メソッドについてです。
このメソッドは、クエリ式でおなじみなので
特に特記することはありませんw
Where拡張メソッドは、2つのオーバーロードを持っており
以下の書式となっています。
public static IEnumerable<TSource> Where<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate )
public static IEnumerable<TSource> Where<TSource>( this IEnumerable<TSource> source, Func<TSource, int, bool> predicate )
よく利用するのは、一つ目の方ですね。
2つ目の方は、predicateの引数が一つ増えています。
このint型の引数には、該当データのシーケンス内でのインデックス値が
渡されます。
処理によっては、インデックス値が必要な場合もありますので、その時に
このオーバーロードを利用します。
以下、サンプルです。
#region LinqSamples-19 public class LinqSamples19 : 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" } }; // // Where拡張メソッドを利用。 // クエリ式で利用しているwhere句と利用方法は同じ。 // Where拡張メソッドは、2つのオーバーロードをもっており // // 一つは、Func<T, bool>のタイプ。もう一つは、Func<T, int, bool>のタイプとなる。 // 2つ目のタイプの場合、その時のインデックスが引数として設定される。 // Console.WriteLine("===== Func<T, bool>のタイプ ====="); foreach (var aPerson in persons.Where(item => item.Id == 2)) { Console.WriteLine("ID={0}, NAME={1}", aPerson.Id, aPerson.Name); } Console.WriteLine("===== Func<T, int, bool>のタイプ ====="); foreach (var aPerson in persons.Where((item, index) => index == 2)) { Console.WriteLine("ID={0}, NAME={1}", aPerson.Id, aPerson.Name); } } } #endregion
出力結果は、以下のようになります。
===== Funcのタイプ ===== ID=2, NAME=gsf_zero2 ===== Func のタイプ ===== ID=3, NAME=gsf_zero3