SortedSetのコンストラクタでIComparer<T>を明示的に指定しない場合、最小値・最大値はデフォルトのソート順(大小関係)に従って求められます。 一方、コンストラクタでIComparer<T>を指定した場合は、そのIComparer<T>で定義される大小関係に従って最小値・最大値が求められることになります。
つまり、Minプロパティ・Maxプロパティは、IComparer<T>で定義されるソート順でSortedSetをソート(あるいは列挙)したときの、最初または最後の要素を取得するプロパティとなります。 このため、Minプロパティ・Maxプロパティで取得できる値が、常に値としての最小値・最大値になるとは限りません。
デフォルトとは逆順に並べ替えるIComparer<T>を指定してSortedSetを作成し、Minプロパティ・Maxプロパティが返す値の違いを見ると次のようになります。
Min・Maxプロパティを参照してSortedSetの並べ替え順での最初・最後の要素を取得する
using System;
using System.Collections.Generic;
class ReverseIntComparer : IComparer<int> {
public int Compare(int x, int y)
// intのデフォルトの大小関係とは逆の結果を返すようにする
=> -1 * Comparer<int>.Default.Compare(x, y);
}
class Sample {
static void Main()
{
// デフォルトの順序で並べ替えを行うSortedSet
var s1 = new SortedSet<int>() {0, 1, 2, 3, 4};
Console.WriteLine(string.Join(", ", s1));
// 最小値と最大値を表示
// (デフォルトのソート順での最初と最後の要素を表示する)
Console.WriteLine($"Mix: {s1.Min}");
Console.WriteLine($"Max: {s1.Max}");
Console.WriteLine();
// デフォルトとは逆の順序で並べ替えを行うSortedSet
var s2 = new SortedSet<int>(new ReverseIntComparer()) {0, 1, 2, 3, 4};
Console.WriteLine(string.Join(", ", s2));
// 最小値と最大値を表示
// (デフォルトとは逆のソート順での最初と最後の要素を表示する)
Console.WriteLine($"Mix: {s2.Min}");
Console.WriteLine($"Max: {s2.Max}");
}
}
実行結果
0, 1, 2, 3, 4 Mix: 0 Max: 4 4, 3, 2, 1, 0 Mix: 4 Max: 0