using System.Collections.Generic;
public static void Main()
var dictionary = new Dictionary<string, Item>();
dictionary.Add("item_1", new Item{Value="OriginalValue_1"});
dictionary.Add("item_2", new Item{Value="OriginalValue_2"});
Print("Original Dictionary:", dictionary);
var clone = new Dictionary<string, Item>(dictionary);
var deepclone = dictionary.ToDictionary(kv => kv.Key, kv => kv.Value.Clone() as Item);
Print("Cloned Dictionary:", clone);
Print("Deep Cloned Dictionary:", deepclone);
dictionary["item_1"].Value = "This Value Was Changed in the Original Dictionary";
Print("Original Dictionary After Item Changed In Original:", dictionary);
Print("Cloned Dictionary After Item Changed In Original:", clone);
Print("Deep Cloned Dictionary After Item Changed In Original:", deepclone);
public static void Print<T>(string header, Dictionary<string, T> items) {
Console.WriteLine(header);
foreach(KeyValuePair<string, T> item in items) {
Console.WriteLine(" {0}", item);
public class Item : ICloneable {
public string Value {get;set;}
return new Item { Value = Value };
public override string ToString() {
return "Item( " + Value + " );";