ここでは基本型のデフォルトのソート順について見てみます。 int, long等の数値型やDateTime等の型はIComparableインターフェイスを実装していて、デフォルトではそれによって定義される順で並べ替えが行われます。 数値型では数の小さい順、文字列型では辞書順、日付型では日付の古い順での並べ替えが基本となっています。
数値型
int, long, uint, byte等の整数型、float, double, decimal等の実数型は、いずれもその数の小さい順に並べ替えられます。
浮動小数点型
float, doubleの場合、NaN(非数)は-∞(負の無限大)や他の数よりも小さいと扱われる点に注意が必要です。
ヌル許容の数値型
ヌル許容の数値型の場合、null
/Nothing
は他のどの数よりも小さいと扱われます。
またNaNに対しても同様で、null
/Nothing
はNaNよりも小さいと扱われます。 つまり、小さい順位並べるとnull
< NaN < -∞ < MinValue < 0 の順になります。
文字列型
文字列型では、辞書順(文字の順、長さの短い順)に並べ替えられます。
ただ、カルチャや比較方法によっては単なる辞書順にはならないので注意してください。 詳しくは文字列と比較オプション・カルチャの並べ替え規則やカルチャと書式・テキスト処理・暦で解説しています。
null
/Nothing
や空の文字列(長さ0の文字列)が含まれていても並べ替えることができます。 null
/Nothing
は、空の文字列を含む他のどの文字列よりも小さいと扱われます。 つまり、空の文字列を含めて大小関係を並べると、「null/Nothing < 空の文字列 < 1文字以上の文字列」の順となります。
大文字小文字の違いを考慮したソート
文字列をソートする際、場合によっては大文字小文字の違いをどう扱うか厳密に決める必要が出て来ます。 その場合は、StringComparerを使ってどう扱うかを指定することができます。 Sortメソッド、OrderByメソッドともにIComparerを引数に取ることができ、これにStringComparerを指定することで、文字列比較の際の動作を指定できます。
なお、IComparerについては大小関係の定義と比較、StringComparerについて文字列と比較オプション・カルチャの並べ替え規則で詳しく解説しています。
日付型
DateTimeとDateTimeOffsetは日付・時間の古い順に並べ替えられます。
並べ替えに際して、DateTimeではKindプロパティの値は無視されて日時のみが比較されます。 したがって、2000-01-01T00:00:00+00:00
(UTC)と2000-01-01T00:00:00+09:00
(ローカル時刻)と2000-01-01T00:00:00
(タイムゾーン指定なし)はいずれも同一の値として扱われます。 DateTimeの並べ替えでは、自動的にUTCに変換されてから並べ替えられるといったことはありません。 そのため、ToLocalTime・ToUniversalTimeメソッドを使って現地時刻・UTCのいずれかに統一してからソートしないと意図しない結果になる場合があります。
一方DateTimeOffsetでは、日時に加えてOffsetプロパティの値が考慮されて比較されます。 したがって、2000-01-01T00:00:00+09:00
、2000-01-01T00:00:00+00:00
、2000-01-01T00:00:00-05:00
はいずれも異なる値として比較されます。
日付・時間の新しい順に並べ替えるには、次の例のように並べ替え順序を通常と逆の順序に定義したメソッドを用意してからソートします。 逆順(降順)でのソート方法については基本型のソートと昇順・降順でのソート §.降順でのソートを参照してください。
列挙体
列挙体は、整数型に準じた並べ替えが行われ、各メンバに与えられている値の大きさに従って小さい順に並べ替えられます。