2009-05-17 14 views
4

.NETで任意の文字列を辞書キーとして使用できますか?これはテンプレートエンジンの一部であり、ユーザーがカスタムヘッダーと値を追加できるようにする予定です。辞書キーに文字制限がありますか?

ヘッダは "Value of X"または "Analyze Summary of Analyze & XYZ Reports"のようなものになります。珍しいキャラクタなどで例外が発生するかどうか心配です。

サイズ制限はあるものの、256文字を超えると予想します。 MSDNにはこの件に関する詳細は記載されていません。

答えて

4

はい、有効な文字列を使用できます(数十億バイトに制限されています)。

ところで、IEqualityComparer<T>というカスタムを渡して、最大の制限が必要なDictionaryコンストラクタに渡すことがあります。

+0

ペタンティックになると1,073,741,823に近い(文字列オーバーヘッドでは-20) –

+0

あなたは正しいです。私はバイトを意味しました。編集。 –

+0

正しいComparerを使用してください。 System名前空間のStringComparerには、さまざまな比較対象を持つ静的プロパティがいくつかあります。 –

1

キーだけで、.NETの文字列であるので、このSO関連質問を参照してください。辞書にはそのキーと値として使用されるタイプのいずれかの特別な知識を持っていないWhat is the maximum possible length of a .NET string?

7

を。オブジェクトタイプに関係なく、GetHashCodeEqualsのメソッドを呼び出して、値を右のバケットに入れて再度取得できるようにします。つまり、これらのメソッドを正しく実装したクラスをキーとして使用できます。

stringクラスは、値に基づいてこれらのメソッドを正しく実装します。したがって、文字列のインスタンスを構築できれば、それをキーとして使用できます。

+0

他のコンパレータが指定されていない場合、Dictionary(T、U)のコンストラクタは、タイプTが(Tの)iEquatableを実装しているかどうかをチェックします。そうであれば、キーはObject.EqualsではなくiEquatable(of T).Equalsを使用して比較されます。一般に、これは打ち消されませんが、継承可能なクラスがiEquatable(型の)を実装する場合、それから派生した異なる比較セマンティクスを持つクラスは、(EearlierTypeの)iEquatableを再実装する必要があります。 – supercat

関連する問題