*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

C#

ユーザー定義クラスにIComparableインターフェイスを実装して、そのクラスの配列をComparisonデリゲートを使ってソートする。

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*


「<C#> 自作クラスの配列において、ソートの並び替え方法を定義する」における一連の説明(知恵ノート)において、ここでは、「<C#> ユーザー定義クラスにIComparableインターフェイスを実装して、そのクラスの配列をComparisonデリゲートを使ってソートする」について説明します。






総合の目次


本ページを含めた関連事項の総合目次です。

http://note.chiebukuro.yahoo.co.jp/detail/n142378

 

 





 

はじめに


ユーザー定義クラスにIComparableジェネリックインターフェイスを実装します。

IComparableジェネリックインターフェイスとは、配列の並べ替えのために、2つのオブジェクト(配列要素)を比較するメソッドを実装するインターフェイスです。

そして、そのユーザー定義クラスの配列をソートします。

そのソートの際に、Comparisonと言うデリゲートを使ってソートします。





 

サンプルコード


ここで取り上げるサンプルは、なるべく複雑にならない範囲で、ソートを確かめられるものとします。






本サンプの仕様概要


プログラムを実行せると、テキストボックスに元データー(ソートする前のデーター)が表示されます。
ボタンを押すと、ソートが行なわれて、その処理結果がテキストボックスに表示されます。



フォームデザイン等の前準備


コードを記述する前に、フォームのデザイン作成などの、以下の前準備を行なって下さい。

<プロジェクトの作成>
本サンプルの確認用に、新規にプロジェクトを作成して下さい。
プロジェクトの種類は、「Windowsフォームアプリケーション」です。

<フォームのデザイン>
デザイン画面で、テキストボックス(TextBox)を1個と、ボタン(button)を1個貼り付けて下さい。

 デザイン画面

 

<テキストボックスの複数行化>
テキストボックスは、デフォルトでは1行用になっています。
しかし、本サンプルでは、複数行の文字を扱いたいので、以下の操作で、テキストボックスを複数行対応にして下さい。
まず、先程貼り付けたテキストボックス textBox1 を選択状態にして下さい(すなわち、デザイン画面上のテキストボックス textBox1 をクリックする)。
そうすると、テキストボックスの右上に、小さな三角形のマークが表示されます。
それをクリックすると Multiline と言う表記のチェックボックスが表示されます。
そのチェックボックスにチェックを入れると、複数行対応になります。
あとは、デザイン画面のチェックボックスをマウス操作で、縦幅を広げて下さい。



テキストボックス三角

 

 

<イベントプロシージャの作成>
デザイン画面のフォーム(無地の部分)をダブルクリックして、Form1_Load() メソッド を作って下さい。

また、デザイン画面で先ほど貼り付けたボタン1(button1)をダブルクリックして、button1_Click() メソッドを作って下さい。


<クラスを書くためのソースファイルの作成>
[プロジェクト] - [クラスの追加] で、「新しい項目の追加」画面を表示する。
その画面の [ファイル名]欄に任意のファイル名(クラス用ソースファイルのファイル名)を記入する。
[追加]ボタンをクリックする。

なお、ここで作成されたソースファイルには、後述しますクラスのコード(「花情報クラスのコード」のコード)を記述します。




 

Formクラスのコード


 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


// ユーザー定義クラスにIComparableインターフェイスを実装して、
// そのクラスの配列をComparisonデリゲートを使ってソートする。
namespace SortUserArrayWithComparison1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        // 花情報列挙配列
        Flower[] FlowersList;

 

        //============
        // フォーム起動時に実行されるイベントプロシージャ
        private void Form1_Load(object sender, EventArgs e)
        {
            // 花情報列挙配列の生成とデーター設定
            FlowersList = new Flower[] {
                                 new Flower { Name="Tulip", Number=7 },
                                 new Flower { Name="Rose", Number=12 },
                                 new Flower { Name="Sunflower", Number=24 },
                                 new Flower { Name="Violet", Number=36 },
                                 new Flower { Name="Chrysanthemum", Number=1 } };


            // 初期データーを表示
            foreach (Flower FlowerWork in FlowersList)
            {
                textBox1.Text += FlowerWork.Name + ",  " + FlowerWork.Number.ToString() + " ";
            }

        }

 

        //============
        // ボタンクリック時に実行されるイベントプロシージャ
        private void button1_Click(object sender, EventArgs e)
        {

            // 並べ替えのために、2つのオブジェクトを比較するデリゲート
            Comparison<Flower> comp = (FlowerWork1, FlowerWork2) => FlowerWork1.CompareTo(FlowerWork2);


            // ソート
            Array.Sort(FlowersList, comp);

 

            // テキストボックスを初期化
            textBox1.Text = "";


            // 結果表示
            foreach (Flower FlowerWork in FlowersList)
            {
                textBox1.Text += FlowerWork.Name + ",  " + FlowerWork.Number.ToString() + " ";
            }

        }

 

    }
}

 


 

花情報クラスのコード


 

 

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


// ユーザー定義クラスにIComparableインターフェイスを実装して、
// そのクラスの配列をComparisonデリゲートを使ってソートする。
namespace SortUserArrayWithComparison1
{

    // 花クラス
    // --- 花に関する各種情報を格納するクラス。
    //     及び、
    //     本クラスの配列において、並べ替えのために、2つのオブジェクト
    //     を比較するメソッドを実装するクラス。
    public class Flower : IComparable<Flower>
    {

        public string Name; // 花名
        public int Number;  // 数

 

        // 並び順比較メソッド
        // 本クラすを配列にした時、並べ替え順序での位置が、比較対象のオブジェクトと比べて前か、後か、
        // または同じかを示す整数を返します。すなわち、本メソッドは、配列要素の並べ替えを行なう際に、
        // 要素と要素の順番を決める比較基準を定義するメソッドです。
        //
        // < 引数 >
        //  第1引数: このインスタンスと比較するオブジェクト
        //
        // < 戻り値 >
        //  0より小さい値の場合: このインスタンスは、並べ替え順序において 引数other の前になります。
        //  0: このインスタンスは、並べ替え順序で、引数other と同じ位置に出現します。
        //  0より大きい値の場合: このインスタンスは、並べ替え順序において 引数other の後になります。
        //
        public int CompareTo(Flower other)
        {
            if (this.Number > other.Number) return 1;
            else if (this.Number < other.Number) return -1;
            else return 0;
        }

    }


}



 

コードの解説


サンプルコードの中に書かれていますコメントを読んで下さい。
すなわち、コードの解説は、基本的にサンプルコードの中に書かれているコメントとします。





実行結果


ボタンをクリックすると、ソートした結果が表示されます。


 

 実行結果1

ソート前の元データーが表示されているフォーム



 

 実行結果2

ボタンをクリックした後の、ソートされたデーターが表示されているフォーム