ラベル Linq の投稿を表示しています。 すべての投稿を表示
ラベル Linq の投稿を表示しています。 すべての投稿を表示

2017年11月10日金曜日

初期化したバイト配列の作成(C#)その2


初期化したバイト配列の別のやり方があったため、記載。
ついでに速度を比較してみました。

実装

配列を作った後に、値を設定しなおして配列に戻すw

var datas = new Double[10000].Select(val=> val = 5.0).ToArray();

もう一つの方法は、こちらを参照

速度比較のコード


private void Test()
{
    InitializeArray_Select();
    InitializeArray_Repeat();
}
private void InitializeArray_Select()
{
    var stopwatch = new System.Diagnostics.Stopwatch();
    stopwatch.Start();
    var datas = new Double[10000].Select(val=> val = 5.0).ToArray();
    stopwatch.Stop();
    Debug.WriteLine( stopwatch.ElapsedTicks );
}
private void InitializeArray_Repeat()
{
    var stopwatch = new System.Diagnostics.Stopwatch();
    stopwatch.Start();
    var datas = Enumerable.Repeat<Double>(5.0,10000).ToArray();
    stopwatch.Stop();
    Debug.WriteLine( stopwatch.ElapsedTicks );
}

比較結果


InitializeArray_Select :6954tick(6.9ms)
InitializeArray_Repeat:3367tick(3.4ms)

Enumerable.Repeatのほうが少しはやい。

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));
        }
    }
}




2016年8月27日土曜日

LinqでListからDictionaryへ変換

ListからDictionaryへ変換


ListからDictionaryを作成する場合に、foreachで回してDictionaryを作成したりしていませんか?(そもそも、最初からDictionaryで確保すればいいんですけど、、、どうしようもなくなっている場合もあると思います。)

C#3.0で追加されたLinqを使えば、簡単に変換することができるようになります。 まず、重複しない文字列のリストがあるとします。
var ballList = new List()
{ "ball","superball","hyperball" };
そのリストから文字列の長さをDictonaryのValueとして保持する形を作るときに、 foreachを使用すると以下のようになります。

 var ballDics = new Dictionary();  foreach(var ball in ballList){    ballDics.Add(ball, ball.Length);}

ただし、処理の途中で、上記のようなコードがあると、Dictonary化したいという意図が伝わらないため、コードの可読性が落ちます。(メソッド化すれば別ですが・・・)
 ただし、Linqを使用することで、以下のように簡単に記載することができます。

 var ballDics = ballList.ToDictionary(val => val, val => val.Length);

上記では、文字列をValueとして入れていますが、構造体配列の一部をキーとしてDictionary化するのに役立つと思います。

public struct Data
{
    public String Name;
    public UInt32 Age;
    public UInt32 Weight;
    public UInt32 Height;
};
private void Convert()
{
    var dataList = new List<Data>()
    {
        new Data(){Name="Suzuki", Age=20,Weight=50,Height=160 },
        new Data(){Name="Tanaka", Age=30,Weight=60,Height=170 },
        new Data(){Name="ito",    Age=40,Weight=70,Height=180 },
        new Data(){Name="sato",   Age=40,Weight=70,Height=180 },
    };
    var dics = dataList.ToDictionary(data => data.Name);
}