fc2ブログ

中の人の徒然草510 議員が不正をするのは自明の理

 ここ最近ニュースを見ていると、議員の不正が取りざたされています。しかしながら、何時ものように、ニュースではワイドショー的に報道されておしまいで す。いつになったら、抽象化して根本的な解決法を考えるのでしょうか・・・TVに出てくる事象政治評論家たちは、結局政治ワイドショー家にしかすぎないと 思えてなりません。
 私が前から言っているように、問題の根本は議員の報酬が「嘘でもなんでもついて、就活(選挙)さえ成功すれば報酬が保障される。おまけに企業と癒着すればもっと儲かる。」である点です。報酬がそうなっているのですから、そのようにして儲けたい人が議員になるのは自明の理だといっていいでしょう。国民の事を考えていないなどといわれていますが、それは当たり前です。考えなくても報酬が貰えるのですから考えるはずがありません。国民のためになることをしたら報酬が貰えるシステムにしておかないと、国民のために仕事をしないのは当然であって、いまさら何を言っているのだろうと不思議でなりません。
 仮に彼らが「国民のために」といっているのが本当ならば、「国民のために仕事をしないで報酬が貰える」という点に疑問を持たないのはおかしいです。疑問を持たないというのは、頭から国民の事はどうでもいいと思っているのか、そんなことも気付かない能力しか持たない人なのであって、前提からおかしいです。日本国民に自殺願望があるとしか思えません。
 とにかく私が言いたいのは「不正をした議員個人をネタにして騒いでおしまい。」という子供じみた行為をやめて、真剣に不正がないようにするにはどのようにすればいいのかをよく考えようという事です。私が思うに解決法は簡単です。国民のために仕事を擦れば、その仕事の成果に応じて報酬を与えるというルールと、天下り、嘘、企業との癒着などをすれば厳罰をかすルールを作るだけです。泥棒は窃盗罪を作らない(例え)のですから、国民が考えるしかありません。それだけで日本がよくなるのに、それをなぜしないのか不思議です。
 やっぱりなんだかんだ言って、日本人は社会人になっていない人が多いのかもしれません。もしくは、報道機関がワイドショー一本になっているかもしれませんね。なにはともあれ、茶番はもうやめて、真面目に国の崩壊を防ぐべきです。口では未来の子供のためだとかかわいそうだとか言っていますが、みんな本気で考えていないようです。そんなことをすれば、明日は我が身です。やるべきことをさっさとやろうよ。
 ただ、戦後70年そうなっていないところを見ると、私が異端なのかもしれません。私が知らないだけで、日本人全員で「自殺するために問題を放置してもっと悲惨な現実を楽しむ」というドMな暗黙のルールが出来上がっているのかもしれません。日本社会には謎が多いです。数学や情報技術よりも難しいです。日本人として生まれて、30数年生きているけど、いまだにわかりません。一体全体どうなっているんだろう・・・

テーマ : 日記
ジャンル : 日記

中の人の徒然草509 政府が知的財産流出国家を目指しているのを嘆く

 報道機関に信頼性がないので、その報道自体が正しいのか疑わしいところですが、一応正しいと仮定して書きます。日本政府は今、特許の財産権を会社のものにするという法案を出そうとしているそうです。今まで日本は、本音は違いましたが建前上、基本的に知的財産は発明者のものとなっていましたが、その建前すら捨てて、企業の支持率を上げたいようですね・・・
 発明をするのは個人です。それにも関わらず、日本は今まで「企業が個人の知的財産を奪って何が悪い」という態度を取ってきました。私は特許庁で「盗みたい放題だから個人で出願するのは馬鹿だ」といわれて、墓の下まで持っていくことを決めています。研究者として勤務している時も、「国が容認しているのだからお前の知的財産を奪って何が悪い。この国は生まれたときから奪うものと奪われるものが決まっているんだ。」と、ブラック企業の社長から言われて、時給100円ぐらいで働いたりしていました。
 先ほども言ったように、その結果、日本の発展は望んでいるものの、断腸の思いで、自分の身の安全を確保するために、知的財産は全て秘密にすることを選びました。私がそういった人間だから思うのですが、人間は奪われると分かっていれば発明しません。
 ですから、発明したい時は中村さんのように、海外に住むことになるでしょう。そうなれば、日本は何の知的財産も生み出せず、技術力を流出する他国にとって有り難い国になるでしょう。建前すら捨てて、本音を言うのは、ある意味すがすがしいですが、建前を本当にしたほうが、日本が発展すると私は思います。
 発明者が望むのは、莫大なお金ではなく、安全に生活できて、ちょっとだけ報酬をもらう事です。発明をしたら何の報酬も得られず、餓死を待つしかなくなるというのは嫌です。発明者だって生存権はあると思います。日本という国が、発明者に生存権を許さないというのは、憲法違反であり、発明者を人間としてみないその態度には心底嫌になります。
 おそらく、政治家は選挙という名の就活が成功したときから報酬が約束されており、個人から報酬をもらっておらず、企業から追加で報酬をもらっているのでそうなるのでしょう。しかしながら、原発事故や火山事件の件からも明らかですが、サービスを受ける国民はどうでもいいというのはまともな国家ではありません。国民一人ひとりの命が国を支えているのであって、企業も人で成り立っています。人を捨てた国は亡ぶしかありません。暴走し、命を刈り取る、国家レベルのウイルスをどうにかしないと、日本は存続しません。
 日本の崩壊を防ぐには、議員の報酬を見なすところから始めないと駄目なのですが、楽して儲かる当人たちが変えることはありません。楽してもう儲けたいから議員になった人が多いでしょうし・・・。まぁ、「楽して儲かりたい人」を募集するのが選挙なのだから当たり前だよな。だから、国民がそれを正さねばならないのですが、日本人は「お上が考えるもの」だと思考停止しています。う~ん、日本人は国が崩壊して「想定外だった」と騒ぐのでしょうが、無理心中するのは嫌です。この絶望的な状況が心底嫌で仕方がありません。

テーマ : 日記
ジャンル : 日記

C#ライブラリリファレンス - データの集合の中から指定した位置にある要素を得る

概要
 Enumerable静的クラスのElementAt拡張メソッドを使用して、指定した位置にある要素を取り出せます。

日常でたとえると
 3番目の商品棚にあるウーロン茶を検品する。

使用に適した状況
 任意の場所にある要素を取り出したい時。集合では並びは関係ありませんから、逐次的な処理をする時に必要になります。

サンプル

/*----------------------------------------------------
 * 
 *  データの集合の中から指定した位置の要素を取り出す
 *  
 ----------------------------------------------------*/
using System;
using System.Linq;

class Sample
{
    static void Main( )
    {
        //データソースを用意
        int max = 10;
        int[ ] values = new int[ max ];
        for ( int i = 0 ; i < max ; ++i )
            values[ i ] = i + 1;
        Console.WriteLine( "データ" );
        foreach ( int v in values )
            Console.Write( "{0} ", v );
        Console.WriteLine(
            Environment.NewLine );

        //指定位置の要素を取り出す
        Console.WriteLine(
            "指定位置の要素を取り出します・・・" );
        int index = 3;
        Console.WriteLine(
            "{0}に位置する要素は{1}です。",
            index, values.ElementAt( index ) );
        Console.WriteLine();

        //存在しない要素を指定すると・・・
        int errorIndex = 10;
        try {
            Console.WriteLine(
                "{0}に位置する要素は{1}です。",
                errorIndex, values.ElementAt( 
                errorIndex ) );
        } catch ( ArgumentOutOfRangeException ) {
            Console.WriteLine( 
                "{0}に要素は存在しません。", 
                errorIndex );
        }
        Console.WriteLine(
           Environment.NewLine );

        //終了
        Console.WriteLine( "サンプル終了。" );
        Console.ReadLine();
    }
}


名前空間
 Sytem.Linq名前空間を参照してください。

解説
 集合指向プログラミンをしている時は、要素の位置は気にしません。集合同士を結合したり、任意の要素を射影したりします。しかしながらプログラミングの幅は広く、命令型プログラミングの逐次的処理も必要になります。
 その状況で必要になるのが「位置を指定して要素を取り出す」処理です。その要求にこたえるのがEnumerable静的クラスのElementAt拡張メソッドです。各コレクションオブジェクト(コンテナオブジェクト)も、その手のプロパティ9を備えていたりしますが、IEnumerableインタフェースを実装するオブジェクトに対して、共通して使用できるので、より抽象的なプログラミングが可能となります。活用して、良いプログラムを作ろう。

テーマ : プログラミング
ジャンル : コンピュータ

中の人の徒然草508 マイクロソフトのたいへんさを知り日本の怠惰さを嘆く

 ここ最近、ライブラリリファレンスを書いていてふと思ったのですが、マイクロソフトってすごいですね。WindowsUpdateを維持するのも金銭的にも労働的にも大変ですし、MSDNリファレンスを維持管理するのも大変でしょう。読んでいるときは意識していなかったのですが、核となると大変です。如何にして、初心者に伝えるのか、それは習得するよりも難しいです。
 そう考えると、日本の全てに対する遅さ、いい加減さには本当に嫌気がさします。日本社会は何をするにも遅く、社会的問題を解決したことがほとんどありません。問題を解決するのではなく、選挙で受かったり、天下り法人を作ったりすることより、報酬を得るシステムにしてしまったドM日本国民が原因といえばそうなのですが、それにしても酷すぎます。いきなりは無理だと思いますので、マイクロソフトのようにちゃんとしろとまでは要求しませんが、もうちょっとましにならないものでしょうか・・・
 もしかしたら日本人は、ものすごく怠惰な民族なのかもしれません・・・戦後70年もこの状態を放置していたのですから、自殺行為としか思えませんし、余りに怠惰すぎます。子供でもわかることをやろうよ。
 どうやら、日本は評価という行為が弱点な様です。国家システムを評価するぐらいならば何をされてもよいというのが今の日本の現状ですし、戦前も兵士は優秀、司令する人は無能といわれていました。それに、馬鹿殿を愛でる文化があるようで、自分よりも位が上だと思った人に対しては一切評価しませんし、会社でもかたくなに人を評価しようとしません。日本はどうも社名や役職名などのレッテルだけを見て、評価をしようともしないので看板詐欺に弱いです。それが、今のIT業界の惨状を生み(おそらく他の業界も同じことが起こっているようです)、日本社会の弊害を生み出しています。う~ん、日本人の私でもこの日本文化が理解できない・・・不思議でなりません。
 ノーベル賞の数とか、金メダルの数とかを見るに、個々の人は優秀です。こんな簡単な事をわからないはずがありません。日本の自殺行為が余計に不思議でなりません。やはり、優秀でわかっているけど苦境を喜ぶドM民族なのかな・・・それとか、馬鹿殿がかわいくて仕方がないとか?わからない・・・

テーマ : 日記
ジャンル : 日記

C#ライブラリリファレンス - 変換演算子でリストを得る

概要
 Enumerable静的クラスのToList拡張メソッドを使用して、IEnumerableオブジェクトを、リストオブジェクトへ変換することができます。

日常でたとえると
 その箱に入っている書類をリスト化して。

使用に適した状況
 リスト特有のメソッドを使用したいなどといった、リストオブジェクトを使用したい場面で使用します。

サンプル

/*---------------------------------------------------------
 * 
 *  変換演算子でリストを得る
 *  
 ---------------------------------------------------------*/
using System;
using System.Linq;
using System.Collections.Generic;

class Sample
{
    static void Main( )
    {
        //配列を用意
        int[ ] ie = new int[10];
        Console.WriteLine(
            "データの型:{0}",
            ie.GetType().FullName );
        Console.WriteLine();

        //リストに変換して確認
        List<int> list = ie.ToList();
        Console.WriteLine(
            "データの型:{0}",
            list.GetType().FullName );
        Console.WriteLine(
            Environment.NewLine );

        //終了
        Console.WriteLine( "サンプル終了。" );
        Console.ReadLine();
    }
}


名前空間
 Sytem.Linq名前空間を参照してください。

解説
 オブジェクト指向プログラミングの極意は、抽象化にあります。しかしながら、具象的な処理も必要となります。例えば、リストオブジェクトが持っているメソッドをどうしても使用したい時などです。その時活躍するのがToList拡張メソッドです。
 オブジェクト指向プログラミングは、抽象化と具象化をうまく使い分けします。抽象的な処理だけではなく、具象化するための処理もマスターしましょう。

テーマ : プログラミング
ジャンル : コンピュータ

C#ライブラリリファレンス - 変換演算子で配列を得る

概要
 Enumerable静的クラスのToArray拡張メソッドを使用して、IEnumerableオブジェクトを、配列オブジェクトへ変換することができます。

日常でたとえると
 そのファイルを並べて。

使用に適した状況
 配列特有のメソッドを使用したいなどといった、配列オブジェクトを使用したい場面で使用します。

サンプル

/*---------------------------------------------------------
 * 
 *  変換演算子で配列を得る
 *  
 ---------------------------------------------------------*/
using System;
using System.Linq;
using System.Collections.Generic;

class Sample
{
    static void Main( )
    {
        //リストを用意
        List<int> ie =  new List<int>();
        Console.WriteLine(
            "データの型:{0}",
            ie.GetType().FullName );
        Console.WriteLine();

        //配列に変換して確認
        int[] array = ie.ToArray();
        Console.WriteLine(
            "データの型:{0}",
            array.GetType().FullName );
        Console.WriteLine( 
            Environment.NewLine );

        //終了
        Console.WriteLine( "サンプル終了。" );
        Console.ReadLine();
    }
}


名前空間
 Sytem.Linq名前空間を参照してください。

解説
 オブジェクト指向プログラミングの極意は、抽象化にあります。しかしながら、具象的な処理も必要となります。例えば、配列オブジェクトが持っているメソッドをどうしても使用したい時などです。その時活躍するのがToArray拡張メソッドです。
 オブジェクト指向プログラミングは、抽象化と具象化をうまく使い分けします。抽象的な処理だけではなく、具象化するための処理もマスターしましょう。

テーマ : プログラミング
ジャンル : コンピュータ

C#ライブラリリファレンス - 生成演算子で空のデータ集合を生成する

概要
 Enumerable静的クラスのEmpty拡張メソッドを使用すると、特定のコレクションオブジェクトを意識しないで、データの空集合を生成できます。

日常でたとえると
 書けるものを用意しておいて。

使用に適した状況
 Listや配列といった、特定のコレクションオブジェクト(コンテナオブジェクト)を意識せず、より抽象的な処理を書きたい場合。

サンプル

/*---------------------------------------------------------
 * 
 *  生成演算子で空のデータ集合を生成する
 *  
 ---------------------------------------------------------*/
using System;
using System.Linq;

class Sample
{
    static void Main( )
    {
        //空のデータ集合を作って確認
        var ie = Enumerable.Empty< int >();
        Console.WriteLine( 
            "データの型:{0}", 
            ie.GetType().Name );
        Console.WriteLine(
            "個数:{0}", 
            ie.Count() );

        //終了
        Console.WriteLine( "サンプル終了。" );
        Console.ReadLine();
    }
}


名前空間
 Sytem.Linq名前空間を参照してください。

解説
 オブジェクト指向プログラミングをしていると、抽象的な処理を書く機会が増えます。抽象的な処理を書けるようになると、プログラミングの力が飛躍的にアップするので、プログラミングが上達するにつれて、自然とより抽象的に書けないかを考えるようになります。
 この際に問題になるは、new演算子の抽象化です。つまり、「どのオブジェクトを使用するのか」を抽象化する必要が生じます。ですが、普通のオブジェクト指向言語の機能を使用すると、特定のオブジェクトを指定し、インスタンスを生成するしかありません。これでは、抽象的な処理が書きにくいです。それ故に、デザインパターンを駆使することになります。
 しかしながら、抽象化により、複雑なオブジェクト設計になるのは避けたいです。シンプルさを突き詰めて、抽象化するのであって、不必要な複雑化は望ましくありません。そこで重宝するのが、特定のインタフェースを持つオブジェクトを生成するメソッドです。
 インタフェースを使用すると、具象的な「どのオブジェクトを生成する」という問題を解決できます。短いサンプルでは有用性を示せませんが、Enumerable静的クラスのEmpty拡張メソッドは、本格的にプログラミングをする上で、非常に役立ちます。覚えておくとよいと思います。

テーマ : プログラミング
ジャンル : コンピュータ

C#ライブラリリファレンス - 2つのデータの集合を外部結合する

概要
 Enumerable静的クラスのGroupJoin拡張メソッドは、2つのデータ集合を、外部結合することができます。

日常でたとえると
 商品表と売上明細表のデータを合体する。ただし、売り上げがない商品も書いておく。

使用に適した状況
 2つ以上のデータ集合を、片方に存在しないデータも含めつつ結合したい場合。

サンプル

/*----------------------------------------------------
 * 
 *  データの集合を外部結合する
 *  
 ----------------------------------------------------*/
using System;
using System.Linq;

class Sample
{
    class Product
    {
        public int ID { get; set; }
        public string Name { get; set; }

        public Product( int id, string name )
        {
            this.ID = id;
            this.Name = name;
        }
        public override string ToString( )
        {
            return String.Format(
                "{0}( ID : {1})",
                this.Name, this.ID );
        }
    }

    class SalesDetails
    {
        public DateTime Date { get; set; }
        public int ProductId { get; set; }
        public int Count { get; set; }
        public SalesDetails( DateTime date, int id, int count )
        {
            this.Date = date;
            this.ProductId = id;
            this.Count = count;
        }
        public override string ToString( )
        {
            return String.Format(
                "売上日:{0} 商品ID「{1}」 数量={2}",
                this.Date, this.ProductId, this.Count );
        }

    }

    static void Main( )
    {
        //データソースを用意
        var products = new[ ] {
            new Product( 1, "釘"), 
            new Product( 2, "金槌"),
            new Product( 3, "ペンチ")
        };
        var values = new[ ] {
            new SalesDetails ( 
                new DateTime( 2014, 4, 10) , 
                    1, 
                    2 ) ,
            new SalesDetails ( 
                new DateTime( 2014, 6, 8) , 
                2, 
                1 ) ,
            new SalesDetails ( 
                new DateTime( 2014, 6, 9 ) 
                , 1, 
                1 )         
        };
        Console.WriteLine( "データ" );
        foreach ( var v in products )
            Console.WriteLine( "{0} ", v );
        Console.WriteLine( Environment.NewLine );
        foreach ( var v in values )
            Console.WriteLine( "{0} ", v );
        Console.WriteLine( Environment.NewLine );

        //データを左外部結合
        Console.WriteLine(
            "データを左外部結合します・・・" );
        var results = products.GroupJoin(
            values,
            x => x.ID,
            y => y.ProductId,
            ( x, sales ) =>
                new { x.Name, x.ID, sales } );
        foreach ( var x in results ) {
            Console.WriteLine( 
                "{0}( ID:{1} )", 
                x.Name,  x.ID );
            foreach ( var y in x.sales )
                Console.WriteLine( "\t{0} ", y );
        }
        Console.WriteLine( Environment.NewLine );

        //クエリ式でデータを左外部結合
        Console.WriteLine( "クエリ式を使用します・・・" );
        var qr1 =
            from p in products
            join s in values 
                on p.ID equals s.ProductId
                into sales
            select new { p.Name, p.ID, sales };
        foreach ( var x in qr1 ) {
            Console.WriteLine(
                "{0}( ID:{1} )",
                x.Name, x.ID );
            foreach ( var y in x.sales )
                Console.WriteLine( "\t{0} ", y );
        }
        Console.WriteLine( Environment.NewLine );

        //入れ子構造のクエリ式でデータを左外部結合
        Console.WriteLine( "クエリ式を使用します・・・" );
        var qr2 =
            from p in products
            join s in
                (
                    from s in values
                    select s
                ) on p.ID equals s.ProductId
                into sales
            select new { p.Name, p.ID, sales };
         foreach ( var x in qr2 ) {
            Console.WriteLine( 
                "{0}( ID:{1} )", 
                x.Name,  x.ID );
            foreach ( var y in x.sales )
                Console.WriteLine( "\t{0} ", y );
        }
        Console.WriteLine( Environment.NewLine );

        //終了
        Console.WriteLine( "サンプル終了。" );
        Console.ReadLine();
    }
}


名前空間
 Sytem.Linq名前空間を参照してください。

解説
 複数のデータを扱う集合指向プログラミングでは、2つ以上のデータ集合を結合することがよくあります。例えば、商品データ集合と、売上明細データ集合を組み合わせると、商品に関する情報がある売上明細情報になります。
 ところで、指定した範囲内に売上がない商品のデータはどうなるのでしょうか?そのデータは含めます。GroupJoin拡張メソッドとJoin拡張メソッドの違いはここで、階層化されて射影します。
 もしかしたら、2つのデータ集合を組み合わせるという行為の有用性が分かり難いかもしれません。その効果を理解するには、データベースとリレーショナル理論を学べば、すぐにわかります。この機会に、データベースとリレーショナル理論を学ぶとよいでしょう。

テーマ : プログラミング
ジャンル : コンピュータ

C#ライブラリリファレンス - 2つのデータの集合を内部結合する

概要
 Enumerable静的クラスのJoin拡張メソッドは、2つのデータ集合を、内部結合することができます。

日常でたとえると
 商品表と売上明細表のデータを合体する。

使用に適した状況
 2つ以上のデータ集合を結合したい場合。データの集合は、組み合して本領を発揮するので、頻繁に使用する拡張メソッドです。

サンプル

/*----------------------------------------------------
 * 
 *  データの集合を内部結合する
 *  
 ----------------------------------------------------*/
using System;
using System.Linq;

class Sample
{
    //商品
    class Product
    {
        public int ID { get; set; }
        public string Name { get;set;}
        public Product( int id, string name )
        {
            this.ID = id;
            this.Name = name;
        }
        public override string ToString( )
        {
            return String.Format( 
                "{0}( ID : {1})",
                this.Name, this.ID);
        }
    }

    //売上明細
    class SalesDetails
    {
        public DateTime Date { get; set; }
        public int ProductId { get; set; }
        public int Count { get; set; }
        public SalesDetails( DateTime date, int id, int count )
        {
            this.Date = date;
            this.ProductId = id;
            this.Count = count;
        }
        public override string ToString( )
        {
            return String.Format(
                "売上日:{0} 商品ID「{1}」 数量={2}",
                this.Date, this.ProductId, this.Count );
        }

    }

    static void Main( )
    {
        //データソースを用意
        var products = new[] {
            new Product( 1, "釘"), 
            new Product( 2, "金槌")
        };
        var values = new[ ] {
            new SalesDetails ( 
                new DateTime( 2014, 4, 10) , 
                    1, 
                    2 ) ,
            new SalesDetails ( 
                new DateTime( 2014, 6, 8) , 
                2, 
                1 ) ,
            new SalesDetails ( 
                new DateTime( 2014, 6, 9 ) 
                , 1, 
                1 )         
        };
        Console.WriteLine( "データ" );
        foreach ( var v in products )
            Console.WriteLine( "{0} ", v );
        Console.WriteLine( Environment.NewLine );
        foreach ( var v in values )
            Console.WriteLine( "{0} ", v );
        Console.WriteLine( Environment.NewLine );

        //データを結合
        Console.WriteLine(
            "データを結合します・・・" );
        var results = values.Join( 
            products, 
            x => x.ProductId,
            y => y.ID,  
            ( x, y ) => 
                new { x.Date, y.Name, x.Count } );
        foreach ( var x in results ) 
                Console.WriteLine( "{0} ", x );
        Console.WriteLine( Environment.NewLine );

        //クエリ式でデータを結合
        Console.WriteLine( "クエリ式を使用します・・・" );
        var qr =
            from s in values
            join p in products
                on s.ProductId equals p.ID
            select new { s.Date, p.Name, s.Count };
        foreach ( var x in qr )
            Console.WriteLine( "{0} ", x );
        Console.WriteLine( Environment.NewLine );

        //終了
        Console.WriteLine( "サンプル終了。" );
        Console.ReadLine();
    }
}


名前空間
 Sytem.Linq名前空間を参照してください。

解説
 複数のデータを扱う集合指向プログラミングでは、2つ以上のデータ集合を結合することがよくあります。例えば、商品データ集合と、売上明細データ集合を組み合わせると、商品に関する情報がある売上明細情報になります。
 ところで、指定した範囲内に売上がない商品のデータはどうなるのでしょうか?そのデータは、無視するというのが内部結合です。Join拡張メソッドは、内部結合ですので、売上明細にない商品のデータは射影されません。
 もしかしたら、2つのデータ集合を組み合わせるという行為の有用性が分かり難いかもしれません。その効果を理解するには、データベースとリレーショナル理論を学べば、すぐにわかります。この機会に、データベースとリレーショナル理論を学ぶとよいでしょう。。

テーマ : プログラミング
ジャンル : コンピュータ

C#ライブラリリファレンス - 要素演算子でデータの集合の中から最後に条件に一致した要素を取り出す

概要
 Enumerable静的クラスのLast拡張メソッドは、数あるデータの中から、指定した条件を満たす最後の要素を取り出すことができます。

日常でたとえると
 つい最近、東京都の最大売上をたたき出した商品を探す。

使用に適した状況
 あるデータの集合の中で、条件を満たす最後のデータが必要になった時。Last拡張メソッドの条件を受け取らないオーバーロードは、位置がわかっているときに使用し、こちらは位置を特定できない場合に使用します。

サンプル

/*----------------------------------------------------
 * 
 *  データの集合の中から
 *  条件に一致した最後の要素を取り出す
 *  
 ----------------------------------------------------*/
using System;
using System.Linq;

class Sample
{
    static void Main( )
    {
        //不完全なランダム値を用意
        int max = 10;
        Random d = new Random();
        int[ ] values = new int[ max ];
        for ( int i = 0 ; i < max ; ++i )
            values[ i ] = d.Next( 0, 100 );
        Console.WriteLine( "データ" );
        foreach ( int v in values )
            Console.Write( "{0} ", v );
        Console.WriteLine( Environment.NewLine );

        //最後の偶数を取り出す
        try {
            Console.WriteLine( 
                "最後の偶数は{0}です。",
                values.Last(
                x => x % 2 == 0 ) );
        } catch ( InvalidOperationException ) {
            Console.WriteLine( 
                "偶数の要素はありません" );
        }
        Console.WriteLine();

        //終了
        Console.WriteLine( "サンプル終了。" );
        Console.ReadLine();
    }
}


名前空間
 Sytem.Linq名前空間を参照してください。

解説
  データを分析するとき、様々なデータを組み合し、その結果の最後の要素を取り出したい時がありま。このようなデータは、代表となるデータもしくは、メソッド内で戻り値にヌル値以外の何らかの意味ある値を設定したい場合などです。ただ、一言に「最後のデータ」といっても、位置を知らない場合がよくあります。
 この場合、条件を判定するオーバーロードのLast拡張メソッドを使用すれば、最初に条件に一致したデータを取り出すことができます。条件を指定できるというのは想像以上に 便利です。最後のデータが欲しいときはあまりないかもしれませんが、覚えておくと、ここぞというときに強力な道具となるでしょう。

テーマ : プログラミング
ジャンル : コンピュータ

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター