2016年8月29日月曜日

Linqで必要な項目の取り出しと変換(Select,Where)

   

やっぱり、見やすいコードを書くには、Linqは欠かせない!!!
ってことで、基本のWhere、Selectについてです。

Select

配列のメンバーに何かしらの処理を適用して、新しいコレクションを返してくれます。
そのため、以下のように、クラス内のプロパティを結合した文字列なんかも作れたりします。
今まで、使ってきたforeachを置き換えることができるケースも出てくると思います。

※実際には、データの受け渡しで新しいクラスに値を設定する場合などに利用できると思います。

using System;
using System.Collections.Generic;
using System.Linq;
namespace Program
{
    public class Family
    {
        public String Myoji { get; set; }
        public String PaPa { get; set; }
        public String MaMa { get; set; }
    }
    public class Program
    {
        public void Main()
        {
            PickupFamily();
        }
        public void PickupFamily()
        {
            var list = new List<Family>()
            {
                new Family() {Myoji = "suzuki",  PaPa = "ichiro", MaMa="hanako"} ,
                new Family() {Myoji = "tanaka",  PaPa = "jiro",   MaMa="hinako"} ,
                new Family() {Myoji = "ito",       PaPa = "saburo", MaMa="hunako"} ,
                new Family() {Myoji = "sato",    PaPa = "siro",   MaMa="henako"} ,
                new Family() {Myoji = "sato",    PaPa = "goro",   MaMa="honako"} ,
            };
            // ここでの戻り値は、IEnumerable<String>
            var names = families.Select((family) =>
            {
                return String.Format("Name:{0} {1}, {2}",
                                        family.Myoji, family.PaPa, family.MaMa);
            });
            // for eachを使うと下のような感じ
            //var names = new List<String>();
            //foreach(var family in families)
            //{
            //    names.Add(String.Format("Name:{0} {1}, {2}",
            //                            family.Myoji, family.PaPa, family.MaMa));
            //} 
            names.ToList().ForEach(name => Console.WriteLine(name));
        }
    }
}

Where

リストから、必要なオブジェクトを取り出したいときに使用します。
以下の例では、佐藤さんだけを取り出したいと思います。
Selectの例では、あまり見た目も変わりませんでしたが、Whereを使用する場合には、
もともとのforeachプラスif文の構成となるため、Whereのほうが見通しのよいコードになると思います。
using System;
using System.Collections.Generic;
using System.Linq;
namespace Program
{
    public class Family
    {
        public String Myoji { get; set; }
        public String PaPa { get; set; }
        public String MaMa { get; set; }
    }
    public class Program
    {
        public void Main()
        {
            PickupFamily("sato");
        }
        public void PickupFamily(String familyName)
        {
            var list = new List<Family>()
            {
                new Family() {Myoji = "suzuki",  PaPa = "ichiro", MaMa="hanako"} ,
                new Family() {Myoji = "tanaka",  PaPa = "jiro",   MaMa="hinako"} ,
                new Family() {Myoji = "ito",     PaPa = "saburo", MaMa="hunako"} ,
                new Family() {Myoji = "sato",    PaPa = "siro",   MaMa="henako"} ,
                new Family() {Myoji = "sato",    PaPa = "goro",   MaMa="honako"} ,
            };
            // ここでの戻り値は、IEnumerable<Family>
            var families = list.Where((family) => { return (family.Myoji == familyName); });
            //var families = list.Where(family => family.Myoji == familyName);                       //var names = new List<String>();
            //foreach(var family in families)
            //{
            //    if (family.Myoji == familyName)
            //    {
            //        names.Add(String.Format("Name:{0} {1}, {2}",
            //                            family.Myoji, family.PaPa, family.MaMa));
            //    }
            //} 
            names.ToList().ForEach(family => Console.WriteLine(family.Myoji + family.PaPa));
        }
    }
}




0 件のコメント:

コメントを投稿