読者です 読者をやめる 読者になる 読者になる

いろいろ備忘録日記

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

Linq入門記-21 (LINQ To Object, Where)


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