連載

C#入門

第14 C#の配列機能

(株)ピーデー
川俣 晶
2001/10/24


配列をソートする

 System.Arrayクラスには、Sortという名のstaticなメソッドがある。これは、その名のとおり、配列をソートする機能を持ったものである。実際にそれを使った例を以下に示す。

 1: using System;
 2:
 3: namespace ConsoleApplication78
 4: {
 5:   class Class1
 6:   {
 7:     static void Main(string[] args)
 8:     {
 9:       int [] ar = { 4, 1, 3, 2, 0 };
10:       Array.Sort( ar );
11:       foreach( int n in ar )
12:       {
13:         Console.WriteLine( n );
14:       }
15:     }
16:   }
17: }
配列のソートを行っているサンプル・プログラム9
staticなArray.Sortメソッドにより配列の要素をソートすることができる。

 これを実行すると以下のようになる。

サンプル・プログラム9の実行結果
初期値では4、1、3、2、0だった配列の内容が昇順にソートされているのが分かる。

 見てのとおり、説明を要する個所はほとんどない。ソートといっても、10行目のSortメソッドの呼び出し一発で終わってしまうのである。

ソートの条件をカスタマイズする

 整数のようなシンプルなデータであれば、何も考えないでソートさせるだけですむ。しかし、より複雑な情報を配列変数で扱った場合、いろいろな解釈が可能であるため、そう簡単にソートを実現することはできない。そこで、ソートの条件をプログラマが指定する方法を説明する。以下が実際にそれを行ったサンプルソースである。

 1: using System;
 2:
 3: namespace ConsoleApplication79
 4: {
 5:   class Item : IComparable
 6:   {
 7:     public string name;
 8:     public int price;
 9:     public Item( string name, int price )
10:     {
11:       this.name = name;
12:       this.price = price;
13:     }
14:     public int CompareTo( object obj )
15:     {
16:       return price - ((Item)obj).price;
17:     }
18:   }
19:   class Class1
20:   {
21:     static void Main(string[] args)
22:     {
23:       Item [] ar = {
24:         new Item("チョコ",50),
25:         new Item("煎餅",200),
26:         new Item("飴",10),
27:         new Item("ポテチ",100)
28:       };
29:       Array.Sort( ar );
30:       foreach( Item it in ar )
31:       {
32:         Console.WriteLine("{0},{1}",it.name,it.price);
33:       }
34:     }
35:   }
36: }
ソートの条件を指定しているサンプル・プログラム10
ソートのための比較に使用されるCompareToメソッドを実装する必要がある。

 これを実行すると以下のようになる。

サンプル・プログラム10の実行結果
各要素が価格によってソートされたのがわかる。

 このサンプルソースは、Itemクラスの配列をソートする。Itemクラスには名前(name)と価格(price)の2つの情報があり、どちらをソートのキーと見るかによってソート結果が変わってしまう。ここでは、価格でソートしたいとする。ソートが行われる際には、IComparableというインターフェイスを通じて、CompareToというメソッドが呼ばれる。CompareToメソッドの結果をコントロールすることにより、思いどおりの順序でソートさせることが可能になるのである。

 CompareToメソッドは、インスタンス自身と引数のインスタンスを比較して、その結果として、整数型の値を返す。返す値の内容は、引数インスタンスよりも小さいときは、負の値、同じなら0、大きければ正の値を返す。16行目では、まさにその値を返すための計算を行っている。要するに、価格を引き算してやれば、指定された条件を満たす結果を返すことができるわけである。


 INDEX
  第14回 C#の配列機能
    1.C#の一次元配列
    2.参照型の配列
    3.参照型配列の初期化
  4.配列をソートする
    5.配列のバイナリ・サーチ
    6.文字配列と文字列の相互変換
 
「C#入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間