2

これがばかげた質問である場合はお詫びしますが、私に聞いてください:

Dictionary<string, string> genericDict = new Dictionary<string, string>;
genericDict.Add("blah", "bloop");
// Use the copy constructor to create a copy of this dictionary
return new Dictionary<string, string>(genericDict);

上記のコードサンプルでは、​​汎用辞書のコピーを作成できます。

ここで、System.Collections.Specialized.StringDictionaryを使用していると仮定します。これは、どこにでも「文字列」タイプを入力する気がないためです。StringDictionaryにはコピーコンストラクターがありません!実際、デフォルトのコンストラクターしかありません。

もちろん、StringDictionaryを繰り返し処理して、各キーと値のペアを手動で追加することはできますが、次のことはしたくありません:-P

なぜコピーコンストラクタがないのですか?ここで何かが足りませんか?

4

4 に答える 4

9

タイプはStringDictionaryかなり時代遅れです。Dictionary<String,String>それがあなたがここで使いたいもの だと思います。

型はいくつかのDictionary<TKey,TValue>強く型付けされたインターフェース(ICollection<KeyValuePair<TKey, TValue>>およびIEnumerable<KeyValuePair<TKey, TValue>>)を実装しているため、型よりも便利ですStringDictionary

StringDictionaryタイプ強くタイプされていますが、怠惰だけのために使用することはお勧めしません。

于 2009-07-15T15:07:06.347 に答える
5

StringDictionaryを本当に使用したい場合(おそらくレガシーアプリケーションをサポートするため)、拡張メソッドを作成できます。

public static StringDictionary NewCopy(this StringDictionary olddict)
{
    var newdict = new StringDictionary();
    foreach (string key in olddict.Keys)
    {
        newdict.Add(key, olddict[key]);
    }
    return newdict;
}

次に、これを行うことができます:

StringDictionary newdict = olddict.NewCopy();
于 2009-07-15T15:13:24.107 に答える
2

私はコンセンサスに同意します - あなたはDictionary<string, string>. ただし、ジェネリック型を常に入力するのが気に入らない場合は、独自のサブクラスを作成できます。

public class StringDict : Dictionary<string, string>
{
  // duplicate all Dictionary's constructors here, calling the base constructor for each. 
}

出来上がり!string を使用したいときはいつでも代わりDictionaryに使用StringDictします。

于 2009-07-15T15:15:00.873 に答える
1

「文字列」型をどこにも入力したくないが、それ以外の点では満足している場合は、サブクラスを作成し、メソッドをオーバーライドしないDictionary<string,string>新しいクラスを作成します。別の名前空間にある限り、それをDictionary<string,string>呼び出すこともできます。StringDictionary

于 2009-07-15T15:13:26.197 に答える