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

いろいろ備忘録日記

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

Linq入門記-13 (LINQ To Object, 変換演算子, ToList)

C# Linq


前回に引き続き、変換演算子についてです。
今回は、ToListメソッドです。


前回やったToArrayメソッドと、ほとんど変わりません。
配列で結果が取得できるか、リストで取得できるかの違いです。


Listで取得した方が便利な場合が多いので、私はもっぱらToArrayよりこちらをよく利用しています。


一応サンプルです。

    #region LinqSamples-13
    public class LinqSamples13 : 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" }
                ,new Person{ Id = 4, Name = "gsf_zero4" }
                ,new Person{ Id = 5, Name = "gsf_zero5" }
            };
            
            var query = from   aPerson in persons
                        where  (aPerson.Id % 2) != 0
                        select aPerson;
            
            Console.WriteLine("============ クエリを表示 ============");
            foreach(var aPerson in query)
            {
                Console.WriteLine("ID={0}, NAME={1}", aPerson.Id, aPerson.Name);
            }
            
            //
            // ToListを利用して、明示的にリストに変換.
            // (このタイミングでクエリが評価され、結果が構築される。)
            //
            List<Person> filteredPersons = query.ToList();
            
            Console.WriteLine("============ ToListで作成したリストを表示 ============");
            foreach(var aPerson in filteredPersons)
            {
                Console.WriteLine("ID={0}, NAME={1}", aPerson.Id, aPerson.Name);
            }
            
            //
            // 元のリストを変更.
            //
            persons.Add(new Person{ Id = 6, Name = "gsf_zero6" });
            persons.Add(new Person{ Id = 7, Name = "gsf_zero7" });
            
            //
            // もう一度、各結果を表示.
            //
            Console.WriteLine("============ クエリを表示(2回目) ============");
            foreach(var aPerson in query)
            {
                Console.WriteLine("ID={0}, NAME={1}", aPerson.Id, aPerson.Name);
            }
            
            Console.WriteLine("============ ToListで作成したリストを表示 (2回目)============");
            foreach(var aPerson in filteredPersons)
            {
                Console.WriteLine("ID={0}, NAME={1}", aPerson.Id, aPerson.Name);
            }
        }
    }
    #endregion


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

  ============ クエリを表示 ============
  ID=1, NAME=gsf_zero1
  ID=3, NAME=gsf_zero3
  ID=5, NAME=gsf_zero5
  ============ ToListで作成したリストを表示 ============
  ID=1, NAME=gsf_zero1
  ID=3, NAME=gsf_zero3
  ID=5, NAME=gsf_zero5
  ============ クエリを表示(2回目) ============
  ID=1, NAME=gsf_zero1
  ID=3, NAME=gsf_zero3
  ID=5, NAME=gsf_zero5
  ID=7, NAME=gsf_zero7
  ============ ToListで作成したリストを表示 (2回目)============
  ID=1, NAME=gsf_zero1
  ID=3, NAME=gsf_zero3
  ID=5, NAME=gsf_zero5