-2

deep copy辞書を作成する次のメソッドがあります。

public static Dictionary<string, MyClass> deepCopyDic(Dictionary<string, MyClass> src)
{
    //Copies a dictionary with all of its elements
    //RETURN:
    //      = Dictionary copy
    Dictionary<string, MyClass> dic = new Dictionary<string, MyClass>();
    for (int i = 0; i < src.Count; i++)
    {
        dic.Add(src.ElementAt(i).Key, new MyClass(src.ElementAt(i).Value));
    }

    return dic;
}

どうにかしてテンプレートにできますか?私MyClassはテンプレートになる必要があります。

4

3 に答える 3

6

Generics をwhere TValue : ICloneable制約付きで使用できます。

public static Dictionary<TKey, TValue> deepCopyDic<TKey, TValue>(Dictionary<TKey, TValue> src)
    where TValue : ICloneable
{
    //Copies a dictionary with all of its elements
    //RETURN:
    //      = Dictionary copy
    Dictionary<TKey, TValue> dic = new Dictionary<TKey, TValue>();
    foreach (var item in src)
    {
        dic.Add(item.Key, (TValue)item.Value.Clone());
    }

    return dic;
}

ICloneableそのメソッドに渡したいすべてのクラスにインターフェイスを実装する必要があります。

Keyまたは、同様に複製された、少し改善されたバージョン:

public static Dictionary<TKey, TValue> deepCopyDic<TKey, TValue>(Dictionary<TKey, TValue> src)
    where TValue : ICloneable
    where TKey : ICloneable
{
    return src.ToDictionary(i => (TKey)i.Key.Clone(), i => (TValue)i.Value.Clone());
}
于 2013-04-11T18:43:47.740 に答える
2

コピー コンストラクター オプションを使用できます。

Dictionary<string, int> copy = new Dictionary<string, int>(dictionary);

このようにして、辞書のディープ コピーを作成します。 元の投稿へのリンク。

于 2015-11-16T09:17:12.020 に答える
1

上記のように、シリアル化されたアプローチが唯一の方法です。ICloneable は、特に大規模なチームでは、オブジェクトを完全に制御できない限り、複製されるオブジェクトのすべてのプロパティが参照を割り当てていないことを保証しません。

シリアライズされたアプローチの唯一の注意点は、ディクショナリで渡されるすべてのオブジェクトがシリアライズ可能であることです。また、リフレクションの過剰使用が発生するため、シリアル化は常に非常に効率的とは限りません。これは、コードのパフォーマンスの高い領域では使用すべきではありません。

高速シリアル化と呼ばれるアプローチを使用してこの問題を解決しましたが、クローンを作成する予定のすべてのオブジェクトが特定のインターフェイスをサポートしている必要があります。それは常に速度と複雑さです。

于 2013-04-11T19:09:01.590 に答える