2014年6月26日木曜日

C#応用 – LINQプログラミング 7


さて、C#応用 LINQプログラミング

第7回である。

ウォッチは 変数を選んで

Ctrl + Q


ForEachメソッド
.NET Framework 3.5のコレクションクラスから

ForEachメソッドが追加された。

List<int> l = new List<int>();

l.Add(1);
l.Add(2);
l.Add(3);

l.ForEach((int i) => { Console.WriteLine(i); });

FoaEachメソッドに繰り返しを行いたい処理のdelegateを渡すことができるメソッドである。

自作すると、このような形式である。

public class Range
{
    public static ForEach(int from, int to, Action<int> act)
    {
        for(int i = from; int <= to; i++) act(1);
    }
}

// 別メソッド
Range.ForEach(0, 10, (i) => { Console.WriteLine("{0}", i); });


yeildとは?
IEnumeratorを実装するクラスの自動生成を行う。

    public class Counter : IEnumerable<int>
    {
        public int CountStop;

        // ジェネリックのIEnumeratorを利用
        public IEnumerator<int> GetEnumerator()
        {
            for (int i = 1; i <= CountStop; i++)
            {
                yield return i;
            }
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }

動作としては、処理の中断である。

仮にCountStopに 10 をセットすると、先ほどのクラスは以下と同等である。

public class Counter : IEnumerable
{
    public IEnumerator<int> GetEnumerator()
    {
        yield return 1;
        yield return 2;
        yield return 3;
        yield return 4;
        yield return 5;
        yield return 6;
        yield return 7;
        yield return 8;
        yield return 9;
        yield return 10;
    }
}

列挙を意図的に中断する場合は、yield breakを使用する。

public class Counter : IEnumerable
{
    public IEnumerator<int> GetEnumerator()
    {
        int i++;
        if (i > 5) yield break;
        yield return i;
    }
}

yield は予約語ではない。(下位互換のため)

yield return や yield break と組み合わせることで構文として意味を持つようになる。


今日の名言
人生はまさにブーメランだ。人に与えたものは手元に返ってくる。
                          デール・カーネギー

誰でも悩みや恐怖やさまざまの病気を追放できる。そして自分の心の
持ち方を変えることにより、人生を一変させることができる。私には
わかっているのだ!なぜなら、そうしたまさかと思われるような変容が
実際に起こるのをこの目で何度も見届けてきたから。あまりにもたくさん
見すぎて、もはや大して驚かないくらいだ。
                          デール・カーネギー

自分の今行っていること、行ったことを心から楽しめるものは幸福である。
                          ヨハン・ウォルフガング・フォン・ゲーテ

ありとあらゆるものに心から興味を持ち、自分の道を歩むに従ってどんな時と
機会が手を差し伸べているかをとらえる目を持ち、自分の手を置けるものは
何物も逃さない者、そうした人間は、短い人生のうちに何と多くの素晴らしい
冒険を手に入れることだろうか!
                          ローレンス・スターン

2014年6月18日水曜日

C#応用 – LINQプログラミング 6



さて、C#応用 LINQプログラミング

第6回である。

応用編なので、まだまだ続くし
内容は濃い。


匿名メソッド
匿名メソッドはメソッドをわざわざ生成せずとも定義可能である。
これにより、イベント定義なども簡単なものであればインラインでできるようになる。

    delegate int MyDelegate(int i);
    class MyClass
    {
        public void Run()
        {
            MyDelegateL a = delegate(int i)
                            {
                                i++;
                                return i;
                            };
            Console.WriteLine(a(10));
        }

    }


ラムダ式
匿名メソッドでは受け渡しできたものはメソッドへの参照であり、コードの一部ではない。

    delegate int MyDelegateL(int i);
    class LambdaExpression
    {
        public void Run()
        {
            MyDelegateL a = (int i) => //  i という引数で扱う
                                    {        //   何か処理を行うのは{}の部分である
                                        i++;
                                        return i;
                                    };
            Console.WriteLine(a(10));
        }

    }



どちらで書いても、11を出力というのは変わらない。

1つだけで実行してるため、何とも味気ない結果である。




外部変数のキャプチャ
ラムダ式が上位スコープの変数を参照しているとき、その変数の寿命を
ラムダ式の寿命が尽きるまで延命する機能である。

delegate void MyDelegate();

MyDelegate GetSayMessageMethod()
{
    string msg = "Hello!";
    return () => {                // 引数がないことを明示している
        Console.WriteLine(msg);
    };
}

// 別メソッド
MyDelegate say = GetSayMessageMethod();

say();


(参考)定義済みdelegate
 ・ .NET Framework 3.5からサポートされるようになった

Action
 ・ 戻り値がvoidのdelegate
  ・ 引数をジェネリックで0個~4個まで指定できるActionが定義済み
  ex) Action<T1, T2, T3, T4>

Predicate<T>
  ・ 引数を1つに戻り値がboolのジェネリックなdelegate

Func<TResult>
  ・ ジェネリックで戻り値と引数を0個から4個まで指定できるdelegate
   ex) Func<T1, T2, T3, T4, TResult>

例によって 11  を出力するプログラムではこの様になる。
    class LambdaExpression2
    {
        public void Run()
        {
            Func<int, int>  a = (int i) =>
            {
                i++;
                return i;
            };
            Console.WriteLine(a(10));
        }

    }

前回の分を合わせ全部まとめて実行するとこうなる。

コードの方に#region という見慣れない

ディレクティブがある。


アウトラインで折りたたみや展開ができる機能らしい。

このように必要に応じて表示・非表示を切り替えたいデモの場合には最適だ。


列挙子とLINQ
取得した結果を簡単に扱うために必要である。

isInclude myInclude = delegate(string param)
    {
        if (param.StartsWith("新"))
        {
            return true;
        }
        else
        {
            return false;
        }
    };

var query = ary.Where(x => myInclude(x));

foreach(var item in query)    // この部分で使用される
    {
        Console.WriteLine(item);
    }


列挙子とは?
C# 1.X および.NET Framework 1.X では以下のような列挙をサポートするための

インターフェースが定義されている(変形のIterator)
C# 2.0以降では、ジェネリック版もある。

public interface IEnumerator
{
    bool MoveNext();
    object Current { get; }
    void Reset();
}

public interface IEnumerable
{
    IEnumerator GetEnumerator();
}

IEnumerable を実装すると

    public class Counter : IEnumerable
    {
        public int CountStop;

        public IEnumerator GetEnumerator()
        {
            return new CounterEnumerator(this);
        }
    }

そして、IEnumerator を実装すると

   public class CounterEnumerator : IEnumerator
    {
        private int _counter;
        private Counter myCounter;

        public CounterEnumerator(Counter counter)
        {
            myCounter = counter;
            Reset();
        }

        public bool MoveNext()
        {
            _counter++;

            return _counter <= myCounter.CountStop;
        }

        public object Current
        {
            get { return _counter; }
        }

        public void Reset()
        {
            _counter = 0;
        }
    }

利用するには、ということで



while を使う場合と

foreachを使う二通りが

挙げられている。






実行結果としては、どちらでやっても

1~10までを表示する。




今日の名言
愚か者は幸福がどこか遠いところにあると思い込んでいる。利口者は幸福を
足元に育てる。
                                 ジェイムズ・オッペンハイム

幸運は毎月やってくる。だがこれを迎える準備ができていなければ、ほとんど
見過ごしてしまう。今月こそ幸運を見逃すな。
                                 デール・カーネギー

人を幸福にするものは、どれだけたくさんのものを持っているかということではなく、
手持ちのものをどんなふうに楽しむかということである。
                                 チャールズ・H・スパーション

どんな時でもそうだが、今度も大変よい機会だ、それをどう扱うかさえ知っていれば。
                                 ラルフ・ワルド・エマーソン

人間の幸不幸は運によるところも大きいが、その人の気質によるところも、
これに劣らず大きい。
                                 ラ・ロシュフコー

チャンスが目の前に現れた時にこれをつかむ人間は、十中八九成功する。不慮の
事故を乗り越えて、自力で自分のチャンスをつくり出す人間は、百パーセント
成功する。
                                 デール・カーネギー

2014年6月13日金曜日

C#応用 – LINQプログラミング 5


デモとハンズオンを収めたCDには

デモが4つあった。

実際に見たもの以外もありそうだ。




さて、C#応用 LINQプログラミング第5回である。

今回はLINQ実装からとなる。

LINQ実装
.NET Frameworkに含まれるLINQ実装は次の通り。
 ・ LINQ to Object
 ・ LINQ to ADO.NET
       > LINQ to SQL
       > LINQ to Entities
       > LINQ to DataSet
 ・ LINQ to XML


LINQ to Objectとは?

  • オブジェクトのコレクションを操作するものである。
  • System.Linq名前空間にある。
  • ユーザ作成のオブジェクトだけでなく、多くのオブジェクトに対するクエリが記述できる。
         例えば、
              > ディレクトリにあるファイル
              > レジストリ
              > Process
              > ログ
              > etc...



LINQ to ADO.NETとは?
 ・ LINQ to SQL
     .NETのカスタム型と物理テーブルのスキーマ間でのマッピングを処理する。

 ・ LINQ to Entities
  LINQ to SQLと酷似しているが、永続化層に直接データベースを利用するのではなく、
  概念Entitiy Data Modelを利用し、物理データへの依存しない構造を実現する。

 ・ LINQ to SQL
  DataSetに対してクエリを行う実装である。


LINQ to XMLとは?
 ・ XMLデータに対するクエリ、データ操作が可能な実装である。
 ・従来のXML操作に加え、LINQをサポートする新しいクラスを提供する。 


LINQの関連構文について
 LINQを扱う上で避けては通れない構文・構造がある
  • デリゲート
  • 拡張メソッド
  • 匿名型・型推論
  • オブジェクト初期化式

デリゲートとLINQ
式の中で実行させたい処理を記述する際に必要である。
isInclude myInclude = delegate(string param) // この部分の定義され
    {
        if (param.StartsWith("新"))
        {
            return true;
        }
        else
        {
            return false;
        }
    };

var query = ary.Where(x => myInclude(x)); // この部分で使用される


デリゲートとは?
1つもしくは複数のメソッドをカプセル化するクラスで、一般的には関数へのポインタである。    
デリゲートは複数の関数のポインタを保持できる。




CD LINQDemo02-03-Delegate

Delegate1x.cs


デリゲートの記述
「new デリゲート名」が暗黙的に変換されるようになり、メソッド名を単純に指定する
だけで同様のことができる。




CD LINQDemo02-03-Delegate

Delegate20.cs


メインはこのように書いてあるので、

        static void Main(string[] args)
        {
            Delegate1x s1 = new Delegate1x();
            s1.Run();

            Delegate20 s2 = new Delegate20();
            s2.Run();


          Console.ReadLine();
       }





両方あわせて実行すると、11が2回でる。





今日の名言
一つの点で幸福になれなければ、他の点で幸福になればよい。こうした目標転換を
するには処世訓はあまり役に立たない。なぜなら、健康と人柄のよさが一番の問題
だからだ。多くの人間が幸福を追い求めるさまは、まるでうっかり者が帽子を追いかける
ようだ。ちゃんと手にするか頭にかぶっているのに、自分では気づかない。
                                ウィリアム・シャープ

幸福は物事の味にあって、物事そのものにあるのではない。幸福になるのは、自分の
好きなものを持っているからであり、他人が良いと思うものを持っているからではない。
                                ラ・ロシュフコー

人間が幸福であるかは、その人の人生に起こる様々の出来事をどういう目で見るか、
ということにかかっており、そうした出来事の性質そのものにはそれほど関係がない
ということを、私はますます信ずるに至った。
                                ウィリアム・フォン・フンボルト

2014年6月7日土曜日

C#応用 – LINQプログラミング 4


さて、C#応用 – LINQプログラミングの

4回目である。

今回はエンティティ間の関係の

記述の話からである。



エンティティ間の関係の記述例
  // リレーショナルモデル
    class Customer
    {
        public string Name;
        public string Office;
    }
    class Order
    {
        public string CustomerName;
        public string ItemName;
        public int Qty;
    }
  // リレーショナルモデル
  var result = from c in Customer
                     join o in Order
                     on c.Name equals o.CustomerName
                     select new
                     {
                         c.Name,
                         c.CompanyName,
                         o.ItemName,
                         o.Qty
                     };

    // 1対多のモデル
    class Customer
    {
        public int ID;
        public string CompanyName;
        public Order[] Orders;
    }
    class Order
    {
        public string ItemName;
        public int Qty;
    }

    // 2関係
    Customer[] customers = ・・・;

    var results = from c indexer customers
                 where c.ID == 9
                 from o in c.Orders
                 select o;


宣言型プログラミングとは?
.NETで利用される言語は手続き型プログラミング言語である。

 手続き型プログラミング言語:問題の解法を記述する
 宣言型プログラミング言語:問題そのものを表現する

LINQはC#, VB.NETに宣言的なプログラミングを持ち込んだものである。
 ・ 開発者は必要とする結果を宣言的に記述する
 ・ 結果を抽出する方法はLINQの実装が考慮すべきこと


従来のプログラミングとの対比
何百社もある、会社名のリストからMicrosoftを抽出したい場合

C#(Not LINQ)
List<string> CompanyNames = …;
List<string> Results = new List<string>();

foreach(string c in CompanyNames)
{
    if (c == "Microsoft")
    {
        Results.Add(c);
    }
}
return Results;


C#(LINQ)
List<string> CompanyNames = …;

return from c in CompanyNames
          where c == "Microsoft"
          select c;


LINQの方がコードが短く、分かりやすく表現されている。

次回、LINQ実装に続く。


今日の名言
満足するための秘訣は、自分の手元にあるものをどうやって楽しめばよいか
知っていること、そして、自分の手の届かないものに対する、ありとあらゆる
欲望を捨て去ることである。
                               林語堂

自分の目の前にある事実そのものは、それをどんなふうに受けとめ、考えるか
ということにくらべれば、それほど重要ではない。事実に対する考え方によっては、
まだ何も手を打たないうちに、人を敗北させるかもしれない。事実に打ち負かされる
のは、自分が事実に打ち負かされていると考えるからだ。
                               ノーマン・ヴィンセント・ピール

陽の当たる場所ばかり見ていれば、影は見えません。
                               ヘレン・ケラー

2014年6月5日木曜日

C#応用 – LINQプログラミング 3

さて、C#応用 – LINQプログラミングの

3回目である。

覚えておきたい選択部分の
一括コメントショートカット
 Ctrl + K ⇒ Ctrl + C コメントアウト
 Ctrl + K ⇒ Ctrl + U アンコメント


拡張メソッド
まずは、前回のサンプルコードの一部を再掲する。

IEnumerable<string> result = places
                                         .Where(a => a.Length == 2)
                                         .OrderBy (a => a)
                                 .Select(a => a.Substring(0, 1));

これらの表現は「拡張メソッド」という機能で統制されている。

Whereはplacesから呼ばれている
 役割:placesのデータを絞り込む

OrderByはWhereから呼ばれている
 役割:Whereで作成されたデータを並び替え

SelectはOrderByから呼ばれている
 役割:OrderByで並び替えられたデータをピックアップし、加工して
     新しいコレクションへと変換している


拡張メソッドのイメージ
  places   元のコレクション
    ↓
  Where   データを絞り込み
     ↓
  OrderBy  データを並び替え
     ↓
  Select   データを加工し、新しいコレクションセットへ

これらのWhere, OrderBy, Selectなどの実装は、placesで指定されている型と
関連するusingで指定された名前空間に依存する

言語統合
これらのクエリは構文としては2~3行程度のものだが、この中には多くの
言語概念や構文が必要となる。
  • ローカルな型宣言
  • 拡張メソッド
  • ラムダ式
  • オブジェクト初期化式
  • 匿名型
  • その他
これらは、「宣言型のコーディングへの移行」や「インピーダンスミスマッチの減少」

へのアプローチである。


データ操作のタイミング
これらのデータ操作はクエリが何らかの結果を得ようとするタイミングに

初めて動作する。つまり、結果セットをインメモリで保持しないのである。

            IEnumerable<string> result = places
                                      .Where(a => a.Length == 2)
                                      .OrderBy(a => a)
                                      .Select(a => a.Substring(0, 1));

            foreach(var place in result)  // ←ココ!!
            {
                Console.WriteLine(place);
            }

上の例では、実際にデータアクセスを行う「foreach」の部分で

クエリが実行される。


今日の名言
明日のことを思いわずらうな。明日のことは、明日自身が思いわずらうであろう。
一日の苦労は、その日一日だけで十分である。
                             「マタイによる福音書」第六章

一、 今日だけは、幸福でいよう。リンカーンは「たいていの人々は、自分で決心
    した程度だけ幸福になれる」と言ったが、まったく至言である。幸福は
    内部から生じる。外部の事柄ではない。

二、 今日だけは、自分自身をその場の状況に順応させて、自分の欲望のために
    すべてを順応させることは控えよう。自分の家族も仕事も運も、あるがままに
    受け入れて、自分をそれに合わせよう。

三、 今日だけは、体に気をつけよう。運動をし、体を大切にし、栄養を取ろう。
    肉体を酷使したり、軽視することは慎もう。そうすれば、体は意のままに
    動く完全な機械になるだろう。

四、 今日だけは、自分の精神を鍛えよう。何か有益なことを学び取ろう。精神的な
    無精者にはなるまい。努力と思考と集中力を必要とするものを読もう。

五、 今日だけは、魂の訓練のために三つのことをしよう。誰かに親切を施し、
    気づかれないようにしよう。ウィリアム・ジェイムズが教えているように、
    修養のために少なくとも二つは自分のしたくないことをしよう。

六、 今日だけは、愛そうよくしよう。できる限り晴れやかな顔をし、穏やかな口調で
    話し、礼儀正しく振舞い、惜しげなく人を褒めよう。他人の批判やあら探しを
    慎み、他人を規制で縛ったり、戒めたりすることをやめよう。

七、 今日だけは、今日一日だけを生き抜くことにして、人生のあらゆる問題に
    同時に取り組むことをやめよう。一生の間、続けるとしたら、嫌気のさすような
    問題でも、十二時間なら我慢できる。

八、 今日だけは、一日の計画を立てよう。処理すべき仕事を一時間ごとに
    書き出そう。予定通りにはいかないかもしれないが、ともかくやってみよう。
    そうすれば、二つの悪癖 - 拙速と優柔不断と縁が切れるかもしれない。

九、 今日だけは、たった一人で静かにくつろぐ時間を三十分だけ生み出そう。
    この時間を使い、時には神について考えよう。人生に対する正しい認識が
    得られるかもしれない。

十、 今日だけは、恐れないようにしよう。特に幸福になることを恐れたり、
    美しいものを楽しむことを恐れたり、愛することを恐れたり、私の愛する人が
    私を愛していると信じることを恐れないようにしよう。
                              シビル・F・パートリッジ