LoginSignup
7
7

More than 5 years have passed since last update.

Visual C# 2013 パーフェクトマスター 8章 LINQ

Posted at

Amazon.co.jp: VisualC#2013パーフェクトマスター (Perfect Master SERIES): 金城 俊哉: 本

自分の不明点をとりまとめ。理解できているところは割愛。

LINQによるデータの抽出

LINQとは.NET3.5以降で実装された様々なデータ集合に対して標準化された方法でデータへの問い合わせを行う手法。

LINQの種類

  • LINQ to ADO.NET
    • LINQ to SQL
    • LINQ to Entities
    • LINQ to DataSet
  • LINQ to XML
  • LINQ to Objects
    LINQ to Objectsは配列やコレクションを直接操作できる。
    以前はforeachを使って記述していたが、LINQを使えばシンプルで読みやすいコードが記述できる

LINQとクエリ式

特定の範囲の数値を取り出す

        static void Main(string[] args)
        {
            int[] numbers = { 1, 2, 3, 4, 5 };
            var query =
                from n in numbers
                where n >= 2 && n <= 4
                select n;
            foreach(var a in query)
            {
                Console.WriteLine(a);
            }

        }

文字列データを取り出す

    class Program
    {
        static string [] getString(string[] str)
        {
            return (
                from s in str
                where s.StartsWith("h")
                select s).ToArray();
        }

        static void Main(string[] args)
        {
            string[] text = { "hogehoge", "fugafuga", "piyopiyo" };
            string[] resulit = getString(text);
            foreach(var n in resulit)
            {
                Console.WriteLine(n);
            }
        }
    }

LINQを利用した並び替え

        static void Main(string[] args)
        {
            int[] num = { 50, 200, 15, 3, 75, 100 };
            var r = from n in num
                    //where n >= 10
                    orderby n
                    select n;
            foreach(var n in r)
            {
                Console.WriteLine(n);
            }
        }

メソッドを使った式に書き換えてみる

    class Program
    {
        static void Main(string[] args)
        {
            int[] num = { 200, 300, 100, 500, 400 };
            //var r = from n in num
            //        where n >= 200 && n <= 400
            //        orderby n
            //        select n;
            // ラムダ式にしてみる
            var r = num.Where((n) => n >= 200 && n <= 400).OrderBy((n) => n);
            //((n) => n >= 200).Where((n)=> n <=400) と書く事もできる
            foreach(var s in r)
            {
                Console.WriteLine(s);
            }
        }
    }

LINQによるデータの加工

select句におけるデータの加工

select句では抽出したデータに対して処理を行うことができる

        static void Main(string[] args)
        {
            int[] num = { 100, 200, 300, 400, 500 };
            var r = from n in num
                    select n * 1.05;
            foreach(var s in r)
            {
                Console.WriteLine(s);
            }
        }

メソッドを使った式に書き換えてみる

        static void Main(string[] args)
        {
            int[] num = { 100, 200, 300, 400, 500 };
            var r = num.Where((n)=> n >=200 & n <=400).Select(n => n * 1.05);
            foreach(var s in r)
            {
                Console.WriteLine(s);
            }

        }

インスタンスのデータを加工する

select句ではnewキーワードによるオブジェクトの作成を行う事ができる。
これを利用してクラス型のように内部に複数のデータを持つオブジェクトを抽出し、新たにオブジェクトを作る事も可能。

    class Item
    {
        public string code;
        public string name;
        public int price;
    }

    class Program
    {

        static void Main(string[] args)
        {
            Item[] i =
            {
                new Item() { code = "A110", name = "Apple", price = 200 },
                new Item() { code = "G201", name = "Orange", price = 150 },
                new Item() { code = "GR50", name = "Grape", price = 450}
            };

            //var q = from n in i select n;
            var q = i.Select(n=>n);
            foreach(var s in q)
            {
                Console.WriteLine("{0} {1} {2}",s.code,s.name,s.price);
            }
        }
    }

匿名オブジェクトを利用して新たなインスタンスを生成

    class Item
    {
        public string code;
        public string name;
        public int price;
    }

    class Program
    {

        static void Main(string[] args)
        {
            Item[] i =
            {
                new Item() { code = "A110", name = "Apple", price = 200 },
                new Item() { code = "G201", name = "Orange", price = 150 },
                new Item() { code = "GR50", name = "Grape", price = 450}
            };

            //select new で新しいインスタンスとして生成している
            // var q = from n in i select new {Name = n.code, Price = n.price * 1.05};
            var q = i.Select((n)=> new {Name = n.code, Price = n.price * 1.05});

            foreach (var s in q)
            {
                Console.WriteLine("{0} {1}", s.Name, s.Price);
            }
        }
    }
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7