次のステートメントを実行すると:
string.Compare("mun", "mün", true, CultureInfo.InvariantCulture)
結果は「-1」で、「mun」の数値が「mün」よりも小さいことを示します。
ただし、このステートメントを実行すると:
string.Compare("Muntelier, Schweiz", "München, Deutschland", true, CultureInfo.InvariantCulture)
「1」が表示され、「Muntelier, Schewiz」が最後になることを示します。
これは比較のバグですか?または、アクセント付きを含む文字列をソートするときに考慮すべきルールはありますか
これが問題である理由は、リストを並べ替えてから、「xxx」で始まるすべての文字列を取得するための手動のバイナリ フィルターを実行しているためです。
以前は Linq の 'Where' メソッドを使用していましたが、別の人が作成したこのカスタム関数を使用する必要があります。
しかし、カスタム関数は、.NET の「ユニコード」ルールを考慮していないようです。そのため、「mün」でフィルタリングするように指示すると、リストに「mun」で始まるアイテムがあるにもかかわらず、アイテムが見つかりません。
これは、アクセント付きの文字の後に続く文字によって、アクセント付きの文字の順序に一貫性がないためと思われます。
OK、問題は解決したと思います。
フィルタの前に、各文字列の最初のn文字に基づいて並べ替えを行います。nは検索文字列の長さです。