SortedSetのコンストラクタで適切なIComparer<T>インターフェイスを指定することで、要素の大小関係比較時の動作をカスタマイズ出来ます。 例えば、比較の際に大文字小文字の違いを無視するようにするといったことが出来ます。
以下は、大文字小文字を無視し、アルファベット順とは逆順(Z-Aの順)になるようにソートするIComparer<string>を実装し、SortedSetでの並べ替え順をカスタマイズする例です。
大文字小文字の違いを無視し、アルファベット順とは逆順に並べ替えるSortedSetを作成する
using System;
using System.Collections.Generic;
// 大文字小文字の違いを無視し、アルファベット順とは逆順にソートするためのIComparer
class CaseInsensitiveReverseStringComparer : IComparer<string> {
public int Compare(string x, string y)
// StringComparer.OrdinalIgnoreCase.Compareとは逆の結果を返すようにする
=> -1 * StringComparer.OrdinalIgnoreCase.Compare(x, y);
}
class Sample {
static void Main()
{
var names = new[] {"Alice", "Eve", "Charlie", "Bob", "Dave"};
var caseSensitiveSet = new SortedSet<string>(names, StringComparer.Ordinal);
var reverseCaseInsensitiveSet = new SortedSet<string>(names, new CaseInsensitiveReverseStringComparer());
Console.WriteLine("caseSensitiveSet");
Console.WriteLine(string.Join(", ", caseSensitiveSet));
Console.WriteLine(caseSensitiveSet.IsSupersetOf(new[] {"aLiCe", "BOB", "dave"}));
Console.WriteLine();
Console.WriteLine("reverseCaseInsensitiveSet");
Console.WriteLine(string.Join(", ", reverseCaseInsensitiveSet));
Console.WriteLine(reverseCaseInsensitiveSet.IsSupersetOf(new[] {"aLiCe", "BOB", "dave"}));
}
}
実行結果
caseSensitiveSet Alice, Bob, Charlie, Dave, Eve False reverseCaseInsensitiveSet Eve, Dave, Charlie, Bob, Alice True
IComparer<T>インターフェイスや実装例については大小関係の定義と比較を参照してください。
文字列の大小関係、StringComparerについて詳しくは文字列と比較オプション・カルチャの並べ替え規則を参照してください。