2010-11-16 4 views
1

У меня есть следующие:DeepCopy SortedDictionary

SortedDictionary<int, SortedDictionary<int, VolumeInfoItem>> 

, что я хочу DeepCopy.

VolumeInfoItem является следующий класс:

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

} 

Я создал следующий метод расширения:

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); 
    } 
} 

Я не могу понять, как получить DeepCopy работает?

+2

Пожалуйста, будьте более конкретным, я не могу сказать, в чем ваша проблема. Быстрые тесты показывают, что 'DeepClone' работает по назначению. – Diadistis

ответ

3

Ваш код выглядит как-то в одном из ответов на этот вопрос: How do you do a deep copy of an object in .NET (C# specifically)?

Но, так как вы знаете тип содержимого вашего словаря, вы не можете просто сделать это вручную?

// 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); 
} 

Составлено в моей голове, поэтому несколько ошибок синтаксиса могли проскользнуть. Вероятно, он может быть немного более компактным с некоторыми LINQ.

+0

Большое спасибо Этьен де Мартель. – user508945

+0

Мне нужно будет сделать больше тестов завтра, но, похоже, хорошо работает – user508945

+1

Последний комментарий был прошен в коде выше. Мы должны прочитать: var subCopy = new SortedDictionary (); – user508945