スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C#ライブラリリファレンス - 変換演算子で列挙子を得て標準メソッドを呼び出す

概要
 Enumerable静的クラスのAsEnumerable拡張メソッドを使用すれば、カスタム演算子とライブラリの標準演算子を使い分けることができるようになります。

日常でたとえると
 標準時のマニュアル手順と、異常時のマニュアル手順を使い分ける。

使用に適した状況
 カスタム演算子を定義し、標準演算子も使用したい場合。これにより、巧妙なプログラムを組めるようになります。

サンプル

/*---------------------------------------------------------
 * 
 *  変換演算子で列挙子を得て標準メソッドを呼び出す
 *  
 ---------------------------------------------------------*/
using System;
using System.Linq;
using System.Collections.Generic;

static class IntList
{
    public static IEnumerable Select(
        this List<int> source,
        Func<List<<nt>, List> selector )
    {
        Console.WriteLine( "カスタムSelect実行" );
        var result = 
            from v in source
            select ( v + 5 );
        return result;
    }
}

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

        //カスタムメソッドを使用
        var x = values.Select( v => v );
        foreach ( int v in x )
            Console.Write( "{0} ", v );
        Console.WriteLine( Environment.NewLine );

        //標準のメソッドを使用
        Console.WriteLine( 
            "標準のSelectメソッドを実行" );
        var y = values.AsEnumerable().Select( v => v );
        foreach ( int v in y )
            Console.Write( "{0} ", v );
        Console.WriteLine( Environment.NewLine );

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


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

解説
 LINQによる集合指向プログラミングを行っていても、オブジェクト指向プログラミングの技法が使いないわけではなく、実務では両方を使用します。具体的にいうと、オブジェクト指向プログラミングの発想で、独自の演算子を実装し、デフォルトの動作を変更することが可能となります。
 しかしながら、常にカスタム演算子が通用するわけではありません。やはり、デフォルトの動作をしてほしいときがあります。その際に使用するのが、AsEnumerable拡張メソッドです。
 このメソッドを使用すれば、列挙子が得られるので、列挙子に対して礼儀されているライブラリの各種標準演算子が使用できるようになります。カスタムとデフォルトの両方を使いこなせるのと非常に心強いので、臨機応変に使いこなせるようになっておくとよいでしょう。
スポンサーサイト

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

C#ライブラリリファレンス - データの集合の中から最初に条件に一致した要素もしくはデフォルト値を取得する

概要
 Enumerable静的クラスのFirstOrDefault拡張メソッドを使用すれば、例外を発生させずに、最初の要素を取得できます。存在しない場合は、デフォルト値を取得します。

日常でたとえると
 指定した売上ノルマを達成した社員を捜し、いなければ、「該当なし」とする。

使用に適した状況
 指定した条件を満たす最初のデータを探したいものの、例外の発生は避けたい場合。ただし、例外処理が面倒というだけで使用してはなりません。

サンプル

/*----------------------------------------------------
 * 
 *  データの集合の中から
 *  最初に条件に一致した要素
 *  もしくはデフォルト値を取得する
 *  
 ----------------------------------------------------*/
using System;
using System.Linq;
using System.Collections.Generic;

class Sample
{
    static void Main( )
    {
        //要素が存在しないときに取り出す
        int max = 10;
        List values = new List();
        if ( values.FirstOrDefault() == null ) {
            Console.WriteLine( 
                "まだデータが存在していません" );
        }

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

        //最大値よりも大きい値を取得しようとする
        string result = values.FirstOrDefault(
                x => Int32.Parse( x ) > 100 );
        if ( result == null )
            Console.WriteLine( "101以上の値はありません" );
        Console.WriteLine();

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


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

解説
 特定の条件を満たす最初の要素を取得したい場合があります。このような処理では、通常のプログラムは例外の発生があります。しかしながら、ユーザーが直接指定するなどといった状況では、例外が発生することは好ましくありません。何故ならば、間違えるのが「仕様」だからです。
 基本的には、例外処理は仕様外の事が起こった時にスローされるのが望ましいです。それは、プログラマーが間違ったプログラムを書いた時や、通信トラブルが起こった時などです。このような観点から、通常は例外処理を避けるべきではありません。ただし、間違った指示をされるのが通常の状態である場合、一々例外をスローしていれば、パフォーマンスが低下しますし、愛想がいいシステムとは呼べません。システムには、ある程度の柔軟性が必要なのです。
 このような場合に使用するのがFirstOrDefault拡張メソッドです。ただし基本的には、例外が発生する方が好ましいので、極力使用しないようにしましょう。

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

C#ライブラリリファレンス - データの集合をグループ化する

概要
 Enumerable静的クラスのGroupBy拡張メソッドを使用すれば、データの集合をグループ化することができます。

日常でたとえると
 分析するために顧客ごとに書類を纏める。

使用に適した状況
 何らかのデータを基準にして、関連するデータを纏めたい場合。例えば、商品別の売上データを見たい時などが該当します。

サンプル

/*----------------------------------------------------
 * 
 *  データの集合をグループ化する
 *  
 ----------------------------------------------------*/
using System;
using System.Linq;

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

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

        //データをグループ化
        Console.WriteLine( 
            "データを名前でグループ化します・・・" );
        var results = values.GroupBy( x => x.Name );
        foreach ( var x in results ) {
            foreach ( var y in x )
                Console.WriteLine( "{0} ", y );
            Console.WriteLine(); //グループを分ける
        }
        Console.WriteLine( Environment.NewLine );

        //クエリ式でデータをグループ化
        Console.WriteLine( "クエリ式を使用します・・・" );
        var qr = from v in values
                       group v by v.Name;
        foreach ( var x in qr ) {
            foreach ( var y in x )
                Console.WriteLine( "{0} ", y );
            Console.WriteLine();
        }
        Console.WriteLine( Environment.NewLine );

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


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

解説
 昨今は、ビッグデータを分析する機会が増えました。その膨大なデータを分析する方法は色々ありますが、基本的なデータの見方は、一つの基準でデータをグルーピングする事です。
 例えば、商品ごとにデータを纏めると、商品の売れ行きや、商品の製造工程などが把握できます。他にも、顧客別にデータをグルーピング化して、好む商品を割り出したり、著作者別に出版した本を把握したりできます。
 このように、グルーピングはデータを扱う上で一般的な処理なので、GroupBy拡張メソッドが用意されています。データを扱う上で避けては通れない重要なメソッドといえるでしょう。

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

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インタフェースを実装するオブジェクトに対して、共通して使用できるので、より抽象的なプログラミングが可能となります。活用して、良いプログラムを作ろう。

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

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カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。