fc2ブログ

C#ライブラリリファレンス - データの集合を射影(選択)する

概要
 Enumerable静的クラスを使用すれば、データの射影(選択)を容易に行えます。射影を使えれば、短く理解しやすいプログラムで、複数のデータを扱う事が可能となります。

日常でたとえると
 大量にあるファイルから受注金額だけを取り出す。

使用に適した状況
 複数のデータに対して、何らかの処理をしたい場合。特に複数のプロパティを持つオブジェクトに対して使用すると、必要なプロパティの値だけ取り出せるので便利です。

サンプル

/*----------------------------------------------------
 * 
 *  データの集合を射影(選択)する
 *  
 ----------------------------------------------------*/
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;
        Console.WriteLine( "データ" );
        foreach ( int v in  values )
            Console.Write( "{0} ", v );
        Console.WriteLine( Environment.NewLine );

        //データを射影
        Console.WriteLine( "データを射影します・・・" );
        var results = values.Select( 
            ( int x ) => x * 10 );
        foreach ( var r in results )
            Console.Write( "{0} ",  r);
        Console.WriteLine( Environment.NewLine );

        //クエリ式でデータを射影
        Console.WriteLine( "クエリ式を使用します・・・" );
        var results1 = from v in values
                       select v * 10;
        foreach ( var r1 in results1 )
            Console.Write( "{0} ", r1 );
        Console.WriteLine( Environment.NewLine );

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


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

解説
 個々のインスタンスを処理するのではなく、複数のインスタンスに対して処理をする、プログラミングの考え方を、集合指向プログラミングと呼びます。集合指向プログラミングを行えれば、冗長になりがちな処理や、複雑な処理を一度に処理することが可能となります。
 この記事で紹介しているSelect拡張メソッドは、集合指向プログラミングの中で、最も基礎的と呼べるものであり、データの要素を選ぶだけです。それ故に、有難味が分かり難いと思います。しかしながら、集合指向プログラミングの要素は、Select拡張メソッドだけではなく、複数の要素を組み合わせて使用するので、実際に使用するときは単体で使用しません。Select拡張メソッドの真価は、他の要素と組み合わせて使用したときに発揮されます。また、データを選んで加工するだけでも意外と便利です。
 Select拡張メソッドそのものは、たいしたことがないように見えますが、先ほど言ったように、集合指向プログラミングは、複数の要素を駆使して行うものですが、個々の要素を理解しなくては習得できません。C#を使いこなしたいならば、集合指向プログラミングは必須知識です。色々試しSelect拡張メソッドの動作をよく覚えておきましょう。
 なお、Select拡張メソッドは、Enumerable静的クラスで定義されています。C#はクエリ式と拡張メソッドの構文があるので、あまり覚える必要はありませんが、深い理解をするためには必要な知識です。頭の片隅において下さい。
スポンサーサイト



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

C#ライブラリリファレンス - 関数をオブジェクトとして扱う

概要
 Funcデリゲートを使用すれば、関数(戻り値を持つメソッド)をオブジェクトして扱えます。

日常でたとえると
 報告書をマニュアル化しておく。

使用に適した状況
 関数そのものをオブジェクトして扱いたい場合。初心者の方はピンと来ないと思いますが、プログラミング力が上がると、関数そのものをオブジェクトとして扱う事の便利さに気が付くようになります。
 具体には、実行する関数を実行時に変えたり、メソッドに渡したりできます。

サンプル

/*----------------------------------------------------
 * 
 *  複数の関数をオブジェクトとして扱う。
 *  
 ----------------------------------------------------*/
using System;
using System.Linq;
using System.Collections.Generic;

class Sample
{
    static void Main( )
    {
        //複数の関数を用意
        List<Func<int, string>> funcs 
            = new List<Func<int, string>>();
        for ( int i = 0 ; i < 10 ; ++i ) {
            int number = i;
            funcs.Add(
                ( int v ) => {
                    return string.Format( 
                        "関数{0}:値{1}",
                        number, 
                        v * number );
                });
        }

        //複数の手続きを実行
        Console.WriteLine( "複数の関数を実行します・・・" );
        var actions = from p in funcs
                      select p;
        foreach ( Func<int, string> f in actions )
            Console.WriteLine( f( 1 ) );

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


名前空間
 System名前空間を参照します。

解説
 戻り値を持つメソッドを関数(ファンクション)と呼びます。通常関数は、コーディング時にプログラムとして直接書きますが、より抽象的に関数を扱えた方が、プログラミングでできることが増えます。
 オブジェクトとして扱えると、メソッドに渡したり、メソッドから受け取ったり、手続きをリスト化したりできます。その結果、初心者には思いつかないアプリケーションを作ったり、より簡潔で柔軟なプログラムを書くことができるようなったりします。
 幸いC#では、デリゲート機能とラムダ式により、簡単に関数をオブジェクトとして扱えます。ですが、乱用をしてはなりません。覚えたての頃は、とにかく使いたくなりますが、下手に使用するとプログラムの可読性が下がり、意図しない結果になるだけです。
 例えば、上記のサンプルでstring.Format( "関数{0}:値{1}",number, v * number );をstring.Format( "関数{0}:値{1}",i, v * number );に変更してみましょう。すると、全てのメッセージが同じになってしまいます。よく考えて使用しましょう。
 関数をオブジェクトとして自由に扱えるようになると、関数型プログラミングが行えるようになります。その時初めて、マルチパラダイム言語C#の力を引き出したといえるでしょう。

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

C#ライブラリリファレンス - 手続きをオブジェクトとして扱う

概要
 Actionデリゲートを使用すれば、手続き(戻り値を持たないメソッド)をオブジェクトして扱えます。

日常でたとえると
 一連の作業をマニュアル化しておく。

使用に適した状況
 手続きそのものをオブジェクトして扱いたい場合。初心者の方はピンと来ないと思いますが、プログラミング力が上がると、手続きそのものをオブジェクトとして扱う事の便利さに気が付くようになります。
 具体には、実行する手続きを実行時に変えたり、メソッドに渡したりできます。

サンプル

/*----------------------------------------------------
 * 
 *  複数の手続きをオブジェクトとして扱う。
 *  
 ----------------------------------------------------*/
using System;
using System.Linq;
using System.Collections.Generic;

class Sample
{
    static void Main()
    {
        //複数の手続きを用意
        List<Action> procedures = new List<Action>();
        for ( int i = 0 ; i < 10 ; ++i ) {
            int number = i;
            procedures.Add(
                ( ) => Console.WriteLine(
                    "手続き" + number ) );
        }

        //複数の手続きを実行
        Console.WriteLine( "複数の手続きを実行します・・・" );
        var actions = from p in procedures
                select p;
        foreach ( Action f in actions )
            f();

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


名前空間
 System名前空間を参照します。

解説
 戻り値を持たないメソッドを手続き(プロシージャ)と呼びます。通常手続きは、コーディング時にプログラムとして直接書きますが、より抽象的に手続きを扱えた方が、プログラミングでできることが増えます。
 オブジェクトとして扱えると、メソッドに渡したり、メソッドから受け取ったり、手続きをリスト化したりできます。その結果、初心者には思いつかないアプリケーションを作ったり、より簡潔で柔軟なプログラムを書くことができるようなったりします。
 幸いC#では、デリゲート機能とラムダ式により、簡単に手続きをオブジェクトとして扱えます。ですが、乱用をしてはなりません。覚えたての頃は、とにかく使いたくなりますが、下手に使用するとプログラムの可読性が下がり、意図しない結果になるだけです。
 例えば、上記のサンプルでConsole.WriteLine("手続き" + number )をConsole.WriteLine("手続き" + i )に変更してみましょう。すると、全てのメッセージが同じになってしまいます。よく考えて使用しましょう。

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

中の人の徒然草504 ブログ再開しようかな

 ふぅー。やっと、仕事が一段落しました。それで、ふと、ブログの事を思い出しました。ブログを再開しようと思いました。とはいうものの、何かを書いていいのかわからないので、今考えたことを書きます。
 ブログって趣味で書いているものですから、書いているときはいいけど、休むと忘れてしまいますよね?それに、いざ書くとなると、何のために書いているのかわからなくなりよね?
 それで、思い出すために、ブログを見てみると、前の日記を読んで、ブログの方向性を模索していたことを思い出しました。よし!リハビリ?にこれをテーマに書きます。

 早速、ブログを書いていた意味について、思い出しました。そうそう。自分が学生時代に誰かのお世話になったから、書こうと思ったのです。恩返しをしなくては。あと、私は社会人だから、後輩を育てる義務のようなものがあるのかもしれません。社会人だから、何か貢献しないと。  さて、ブログの方針なのですが、それを決めるには、定義しなくてはなりません。対象読者のレベルを想定するには、メイン読者である技術者のレベルの定義をしなくては。

【技術者の大まかなレベル】
  • 学生・・・情報技術を知らなくて、プログラミングが全くわからないレベル。プログラミング言語の文法も知らない状態。どんな天才でもこのレベルから始まります。
  • 初心者・・・情報技術をちょっと知って、プログラミングの概念が大まかにわかるレベル。プログラミング言語の文法を知れば簡単なプログラミング(書籍のサンプルぐらいのもの)ができる。
  • 脱初心者・・・プログラミング言語の文法ならば覚えたというレベル。ちょっとしたアプリぐらいならば作れる。
  • 新入社員・・・プログラミング言語の文法とライブラリをある程度マスターした状態。自分で考えて、アプリが作れる。
  • 中級者/アマチュア・・・自分でマニュアルを見て理解し、業務ソフトを作れる状態。複数のプログラミング言語をマスターしている。
  • 上級者・・・呼吸を吸うがごとくプログラミングができるので、業務システムならば一人で作れる状態。特殊な知識が必要なシステムソフト以外ならば何でも作れる。新しいプログラミング言語を1週間以内に使いこなせる。システム対象となる業務の知識が欲しくなる。開発の仕事は、技術面で困ることはなくなる。やはり、技術よりも人間の方が複雑です。
  • 熟練者・・・情技術の全てを理解しているわけではないが、すぐに新しい概念を習得できる状態。新しいプログラミング言語もその場でマニュアルを見て、すぐに対応できる。ここまで到達すると、あとは自分の興味がある技術を深く探求したり、他分野の専門知識を学んだりするかしない。完全なる自己探求の世界です。素晴らしいと思われるでしょうが、情報技術にときめきを感じなくなり寂しくなります…

 大体こんなところかな?私は何で悩んで居たのだろう?この定義を見れば、このブログの方向性は一目瞭然です。上級者以上になると、公式ホームページしか必要なくなりますので、ブログで書ける記事は新入社員以下のレベルのものしかありません。上級者以上になると、技術方面はブログで言われなくても良い状態だから、必要なのは思想とか業務知識とかになります。技術方面の記事となると、非常に特殊なものしかなくなりますので、そんなマニアックなものを書いても社会貢献になりません。
 そもそも、このブログは初心者レベル以下の記事しか書いていないし、答えは自明なはずです。なぜ悩んだのだろう??自分でも分からない。
 という事で結論が出ました。今まで通り、対象人数が多く、一番困っているであろう初心者のために、初心者レベル以下の記事を書きます。
 私にも初心者の時があったので、その時の自分が求めているであろうことを想像しつつ頑張ります♪

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

中の人の徒然草503 またマスメディアの被害者が・・・&記事について

 誠に残念なことですが、理研の笹井さんが自殺されたそうですね。この件で改めて思ったのですが、マスメディアの悪質はすごいですね。そもそもSTAP細胞報道は、これほど騒ぐ必要がないのに、誰かを虐めて儲けたいというだけで執拗に関係者を追い詰めました。論文の間違い云々を言っていますが、間違ったらあれほど騒ぐというのであれば、マスメディアは一体どれだけの誤報やねつ造をしたのでしょうか?
論文の画像のうち3枚が間違っていたというだけで人を殺すところまで追いつめていますが、週刊誌や新聞にどれだけの誤りありのでしょうか?そのことについて、謝罪会見を開いたことがありませんし、自殺した責任を一切感じずに、今度は自殺報道で稼ごうとしています。これほど悪質な業界があるのでしょうか?
 マスメディアは常に誰かを虐めて儲けている業界ですので、適切な法律が立法されることを私は願います。日本は電力会社だから、マスメディアだから、などといった理由で、法と人命が無視され続けているのはおかしいと思います。これらの例をかんがみるに、日本は法治国家を名乗っていますが、明らかに封建的人治国家です。とにかく日本は犯罪行為がやり易くなっているので、それをどうにかしない事には日本の未来はないと思います。

 話は変わりますが、最近このブログの記事をどのようにするのか悩んでいます。仕事は忙しいからあまり時間を掛けられません。とはいえ、社会的な貢献がしたいので、技術記事を書くことは曲げません。という事で、いかにして、初心者から熟練者まで読める技術記事を書くのかというのが命題になるのですが、これが難しいです。初心者に合すと、熟練者の役に立ちません。だからといって、熟練者に合しても、初心者が理解できません。時間さえあれば、どちらの記事も書けばいいのですが、その時間が取れない。う~ん、困ったな・・・

テーマ : 文明・文化&思想
ジャンル : 学問・文化・芸術

プロフィール

インドリ

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カウンター