2014年7月28日月曜日

C#応用 – LINQプログラミング 10 (Exercise1)



さて、LINQプログラミングの第10回は

Exercise1 拡張メソッドとラムダ式を

見ていく。



IEnumerableに対しての検索機能とジェネリックコレクションの利用方法を習得する。

まずは、Ex01.slnのソリューションファイルを開くと

ソリューションエクスプローラのProgram.csはこの様になっている。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ex01
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, string> dicLines = new Dictionary<string, string>();
            #region dictionaryの初期化
            dicLines.Add("A", "都営浅草線");
            dicLines.Add("I", "都営三田線");
            dicLines.Add("S", "都営新宿線");
            dicLines.Add("E", "都営大江戸線");
            dicLines.Add("G", "東京メトロ銀座線");
            dicLines.Add("M", "東京メトロ丸ノ内線");
            dicLines.Add("m", "東京メトロ丸ノ内線方南町支線");
            dicLines.Add("H", "東京メトロ日比谷線");
            dicLines.Add("T", "東京メトロ東西線");
            dicLines.Add("C", "東京メトロ千代田線");
            dicLines.Add("Y", "東京メトロ有楽町線");
            dicLines.Add("Z", "東京メトロ半蔵門線");
            dicLines.Add("N", "東京メトロ南北線");
            dicLines.Add("F", "東京メトロ副都心線");
            #endregion

            //ここに追加(その2)
            foreach (var item in dicLines.MyFindAll("東","ノ"))
            {
                Console.WriteLine("{0}\t{1}", item.Key, item.Value);
            }

            Console.WriteLine("Hit any key...");

            Console.ReadKey();
        }
    }

    static class MyDicExtention
    {
        /// <summary>
        /// Dictionaryの独自拡張メソッド
        /// </summary>
        /// <param name="dic">対象となるDictionary(Key=String,Value=String)</param>
        /// <param name="containsValue">Valueに含むべき文字列</param>
        /// <param name="containsValue2">Valueに含むべき文字列(その2)</param>
        /// <returns>絞り込まれた結果の列挙</returns>
        public static IEnumerable<KeyValuePair<string, string>> MyFindAll
                (
                this Dictionary<string, string> dic,
                string containsValue,
                string containsValue2
                )
        {
            //ここに追加(その1)
            return dic.Where(x => x.Value.Contains(containsValue)
                                &&
                                x.Value.Contains(containsValue2)
                                );
        }
    }
}

自分で追加する部分は、緑のコメントで ここに追加 となっている下の

青文字部分である。

実行結果は次の通り。




単に実行しただけでは、

それが、検索結果だと分かりにくい。


解説
最初に追加した部分(その1)は Dictionary の拡張メソッド「MyFindAll」の実装を

定義している。「MyFindAll」内では Dictionary に対して、引数で与えられた2つの文字列を

Value に含む要素で絞込みを行い、結果を返却している。

次に追加した部分(その2)では、上記 MyFindAll を呼び出して結果を取得し、

Consoleに出力を行う。


参考
その1で追加したソースコードを以下のように変更しても、同じ結果が取得できる。

foreach (var item in dic)
{
    if (item.Value.Contains(containsValue) &&
        item.Value.Contains(containsValue2))
    {
        yield return item;
    }
}

もちろん、実行結果は同じである。



今日の名言
幸福の秘訣は、自分がやりたいことをするのではなく、自分がやるべきことを
好きになることだ。
                               ジェイムズ・M・バリー

我々は幸福も不幸も大げさに考えすぎている。自分で考えていることほど
幸福でもないし、かといって決して不幸でもない。
                               オレン・ド・バルザック

黄金のように貴重な時間の瞬間の機会を大いに利用し、自分の手に届く限りの
良いものをつかみ取ることは、人生における偉大なる芸術行為だと言える。
                               サミュエル・ジョンソン

環境だけで人間の幸不幸が決まるのではないことは、明らかだ。幸福だとか
不幸だとかいう気持ちの在り方は、こうした環境をどのように受け止めるかに
よって決定される。「天国は心の中にある」とはキリストの言葉だが、
地獄もまた同様である。
                               デール・カーネギー