2010-11-16 23 views
1

Je donne les résultats suivants:deepcopy A SortedDictionary

SortedDictionary<int, SortedDictionary<int, VolumeInfoItem>> 

que je veux deepcopy.

VolumeInfoItem est la classe suivante:

[Serializable] 
public class VolumeInfoItem 
{ 
    public double up = 0; 
    public double down = 0; 
    public double neutral = 0; 
    public int dailyBars = 0; 

} 

J'ai créé la méthode d'extension suivante:

public static T DeepClone<T>(this T a) 
{ 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     BinaryFormatter formatter = new BinaryFormatter(); 
     formatter.Serialize(stream, a); 
     stream.Position = 0; 
     return (T)formatter.Deserialize(stream); 
    } 
} 

Je ne peux pas comprendre comment faire le travail deepCopy?

+2

S'il vous plaît être plus précis, je ne peux pas vraiment dire quel est votre problème ici. Un test rapide montre que 'DeepClone' fonctionne comme prévu. – Diadistis

Répondre

3

Votre code ressemble à quelque chose dans l'une des réponses de cette question: How do you do a deep copy of an object in .NET (C# specifically)?

Mais, puisque vous connaissez le type de contenu de votre dictionnaire, ne pouvez-vous le faire manuellement?

// assuming dict is your original dictionary 
var copy = new SortedDictionary<int, SortedDictionary<int, VolumeInfoItem>>(); 
foreach(var subDict in dict) 
{ 
    var subCopy = new SortedDictionary<int, VolumeInfoItem>(); 
    foreach(var data in subDict.Value) 
    { 
     var item = new VolumeInfoItem 
        { 
         up = data.Value.up, 
         down = data.Value.down, 
         neutral = data.Value.neutral, 
         dailyBars = data.Value.dailyBars 
        }; 
     subCopy.Add(data.Key, item); 
    } 
    copy.Add(subDict.Key, subCopy); 
} 

Compilé dans ma tête, donc quelques erreurs de syntaxe pourraient avoir glissé. Il pourrait aussi être rendu un peu plus compact avec un peu de LINQ.

+0

Merci beaucoup Etienne de Martel. – user508945

+0

Je devrai faire plus de tests demain mais ça marchera bien – user508945

+1

Un dernier commentaire il y avait une erreur dans le code ci-dessus. Nous devrions lire: var subCopy = new SortedDictionary (); – user508945