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