5

String.CompareTo のデフォルトの並べ替え順序をバイト単位の順序に設定できる戦略を探しています。メソッドの呼び出しでソート順を指定せずにこれを行う必要があります。

いくつかの戦略を試しましたが、満足のいく結果は得られませんでした。私はこれまでに得ました:

CultureAndRegionInfoBuilder crib = 
            new CultureAndRegionInfoBuilder("foo", CultureAndRegionModifiers.Neutral);

        CompareInfo compareInfo = new CustomCompareInfo();
        crib.Register();

この CustomCompareInfo で、デフォルトの CompareInfo クラスをオーバーライドしようとしましたが、残念ながらこれはコンパイルされません。

The type 'System.Globalization.CompareInfo' has no constructors defined

私はここで立ち往生しています。CompareInfo のカスタム実装が私の問題の解決策であると感じました。

これについて何かアイデアはありますか?

編集:私の質問の文脈:

私が取り組んでいるこのプロジェクトは非常に珍しいものです。巨大なコードベースが他のプログラミング言語から .NET に変換されています。このプログラミング言語では、文字列比較のデフォルトは序数であり、この .NET との違いにより、変換されたコードベースでバグが発生しているため、.NET を同じデフォルトの動作に構成できれば、最も洗練されたソリューションになると考えました。

もちろん、比較指定子を使用してコードを再変換することは可能です。または、序数 (バイナリ) 比較を実行する拡張メソッドを導入することもできます。などなど..

ただし、私に関する限り、アーキテクチャの観点から見ると、これらのソリューションは洗練されていません。これが、フレームワークでこの序数比較をグローバルに設定できるソリューションを探している理由です。

前もって感謝します!

4

2 に答える 2

4

申し訳ありませんが、これを機能させることはできません。CompareInfo クラスにコンストラクターがあります。ただし、これは内部的なものであり、CultureInfo を引数として取ります。実際の実装には、mscorlib に組み込まれた並べ替えテーブルを反映する CultureInfo のプライベート メンバーが含まれます。それらは拡張可能ではありません。

これは実際に VB.NET で機能します。おそらく、これを追求している理由です。バイナリ比較を選択できる Option Compare ステートメントがあります。ただし、これは CultureInfo では実装されておらず、コンパイラによって実行されます。文字列比較を認識し、選択された Option Compare を認識するカスタム vb.net 文字列比較メソッドに置き換えます。その名前は Microsoft.VisualBasic.CompilerServices.Operators.CompareString() です

C# コンパイラを同じ動作に誘導することはできません。変換された vb.net コードの比較式を入念に置き換える必要があります。もちろん、ひどい仕事であり、間違いが非常に起こりやすいです。コンバーター プログラムによって変換が行われた場合は、適切な逆コンパイラを使用した方がよい場合があります。それは CompareString() 呼び出しを隠しません。

于 2012-06-27T12:53:21.033 に答える
1

デフォルトの比較モード (ここでは序数) を設定する手段はないようです。

常に一貫性のある比較結果が必要な場合は、アプリで作成するスレッドごとに、カルチャを「不変」に設定できます (パラメーターとして空の文字列を持つ cultureInfo) Thread.CurrentThread.CurrentCulture = new CultureInfo("") ; パフォーマンスのために序数比較を実行したい場合、グローバルに何もできないと本当に思います.文字列比較を実行するたびに、このオプションを明示的に渡す必要があります.

正確に何が必要か教えていただけますか?

于 2012-06-27T13:03:33.867 に答える