C#ライブラリリファレンス - 常に整列されている状態でデータを格納管理する
SortedListクラスを使えば、常にソートされた形でデータを格納管理できます。
日常でたとえると
会社の倉庫は常に整理されている。
使用に適した状況
データ発生件数よりも参照している回数の方が多い場合。もし、大量のデータが発生している状況で使用すれば、ソートコストによりパフォーマンスが悪くなります。
サンプル
/*----------------------------------------------------
*
* 常にソートされているリストのサンプル
*
----------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
class Sample
{
static void Main( )
{
//数値のリストを作成
var numbers = new SortedList<int, int>();
for ( int i = 1 ; i < 10 ; ++i ) {
numbers.Add( i, i );
}
PrintNumbers( "0~9の数値:", numbers );
//0を忘れていた!
numbers.Add( 0, 0 );
PrintNumbers( "0を追加:", numbers );
//マイナス値も欲しい
for ( int i = 1 ; i < 10 ; ++i ) {
numbers.Add( -i, -i );
}
PrintNumbers( "-9~9の数値:", numbers );
//0を10にしてみる
//キーではないので順番は変わらない
numbers[ 0 ] = 10;
PrintNumbers( "0を除く-9~10の数値:", numbers );
//そうだ0を消して10を入れよう
numbers.Remove( 0 );
numbers.Add( 10, 10 );
PrintNumbers( "0を除く-9~10の数値:", numbers );
//終了
Console.ReadLine();
}
//数値を表示。
private static void PrintNumbers(
string tile,
IEnumerable<KeyValuePair<int, int>> numbers )
{
Console.Write( tile );
foreach ( var number in numbers )
Console.Write( "{0} ",
number.Value );
Console.WriteLine();
}
}
名前空間
System.Collections.Genericを参照します。LINQプログラミングのために、System.Linq名前空間も参照しましょう。
解説
通常のリストジェネリックオブジェクトは、データを格納した後、Sortメソッドを使って並び替えます。適切な状況を選んで、ソートしてから処理をする場合それでも良いのですが、システムの仕様上、常にソート(整列)されなければならないときあります。
もしこのような状況下で、プログラマに任せてしまうと、些細なミスで仕様を満たさなくなります。この事態は、状況によっては非常に見つけにくいバグとなる可能性があります。従って、個人がメソッドを呼び出すことを要請して、リストジェネリックオブジェクトを使用するのは不適切なのです。
幸い.NETのライブラリには、その名も SortedListという要望に合致したオブジェクトが用意されています。このオブジェクトを使用すれば、バグを未然に防ぐことができます。ただし、だからといって、常にSortedListを使用するのは賢明といえません。
あくまでも、ソートされているのが前提となっているシステムの実装で使用するものであり、基本的にはリストジェネリックオブジェクトを使用するようにしてください。そうしないと、オオカミ少年のようになってしまい、プログラムの意図が正しく伝わらなくなってしまいます。また、ソートにコストがかかるので、無意味にパフォーマンスを下げる結果になってしまいます。
最後に一つ注意するべきことがあります。それは、SortedListに格納する要素には、整列の基準となるキーが必要である点です。リストと同じ感覚で使用すると、少し面食らうと思います。