オブジェクト初期化子、コレクション初期化子のサンプル


namespace CSharpLearningClass
{
    class Sample2
    {
        class Pet
        {
            //自動実装するプロパティ
            public int Age { get; set; }
            public string Name { get; set; }
        }

        class Move : Pet
        {
            public int X { get; set; }
            public int Y { get; set; } 

            //暗黙的派生 System.ValueType の ToString関数 のオーバーライド
            public override string ToString()
            {
                return string.Format("Name={0} Age={1} X={2} Y{3}", Name, Age, X, Y);
            }
        }

        public Sample2()
        {
            //オブジェクト初期化子を利用したインスタンス化。この場合カッコはいらない。明示的なコンストラクターを必要としない
            Pet Pet = new Pet { Age = 12, Name = "jiro" };

            //匿名型も作成可能。型はコンパイラにより推論される。LINQクエリ式などでも利用できる
            var pet = new { Name = "ooyama", age = 12 };

            //継承されていてもオブジェクト初期化子は利用可能
            Move enemy = new Move { X = 12, Y = 24, Name = "Taro", Age = 14 };

            //コレクション初期化子。コレクション作成でも可能
            List<Move> moveList = new List<Move>();
            moveList = new List<Move>
            {
                new Move{ X = 12, Y = 24, Name = "Taro", Age = 14 },
                new Move{ X = 48, Y = 64, Name = "Otani", Age = 28 },
                new Move{ X = 92, Y = 128, Name = "Jiro", Age = 52 },
                new Move{ X = 153, Y = 62, Name = "Iiyama", Age = 52 },
            };

            IEnumerable<Move> selectList =
                from i in moveList
                where i.Age > 32
                select i;

            foreach (var item in selectList) { Console.WriteLine(item); }   //MoveでオーバーライドしたToString()で表示される

            //匿名型を使用すると、LINQ クエリ式の select 句によって元のシーケンスのオブジェクトを値と形状が元とは異なるオブジェクトに変換できます
            //この方法はシーケンス内の各オブジェクトの情報の一部のみを保存する場合に便利です
            var choice =
                from i in moveList
                where i.X > 64
                select new { i.Name, i.Age, Yokojiku = i.X };   //匿名型を作成するときにフィールドの名前を変更することもできます

            foreach (var item in choice) { Console.WriteLine("{0} : {1} : {2}",item.Name,item.Age,item.Yokojiku); }

           //匿名、拡張関数や暗黙的な機能、ラムダ式を利用しながら書くとこんな事ができる
            var number =  new[]{ 1,2,3,4,5 }.Where(x => 2 < x && x < 5).Select(x => x*2);    //匿名で作成したコレクションから抽出。2より大きく5より小さい値を×2して収める
            foreach (var item in number) { Console.WriteLine(item); }

        }
    }
}
最終更新:2012年05月27日 02:20