TheDeveloperBlog.com


C# Copy Dictionary

Copy dictionary. A Dictionary has a copy constructor. When you pass an existing Dictionary to its constructor, it is copied. This is an effective way to copy a Dictionary's data. When the original Dictionary is modified, the copy is not affected.

Constructor

Example. The simplest way of copying your Dictionary, using a custom loop over the keys, is prone to code duplication and errors. It doesn't make any sense to write the loop yourself. The code is present in the Dictionary class itself.

Here: We use the copy constructor. And the example demonstrates how the internal structures are copied.

C# program that copies entire Dictionary

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
	//
	// Create and initialize Dictionary.
	//
	Dictionary<string, int> dictionary = new Dictionary<string, int>();
	dictionary.Add("cat", 1);
	dictionary.Add("dog", 3);
	dictionary.Add("iguana", 5);

	//
	// Copy the Dictionary to a second object.
	//
	Dictionary<string, int> copy = new Dictionary<string, int>(dictionary);

	//
	// Change the first Dictionary. It won't change the copy.
	//
	dictionary.Add("fish", 4);

	//
	// Display the first Dictionary.
	//
	Console.WriteLine("--- Dictionary 1 ---");
	foreach (var pair in dictionary)
	{
	    Console.WriteLine(pair);
	}
	//
	// Display the second Dictionary.
	//
	Console.WriteLine("--- Dictionary 2 ---");
	foreach (var pair in copy)
	{
	    Console.WriteLine(pair);
	}
    }
}

Output
    (Modifying the first Dictionary doesn't affect the copied Dictionary.)

--- Dictionary 1 ---
[cat, 1]
[dog, 3]
[iguana, 5]
[fish, 4]
--- Dictionary 2 ---
[cat, 1]
[dog, 3]
[iguana, 5]

The code defines the Main entry point, and initializes a new Dictionary first. It populates the Dictionary with three key-value pairs. Next, it copies the Dictionary into the second Dictionary "copy".

Finally: It adds a key to the first Dictionary, and displays both Dictionaries. The key added after the copy was made is not in the copy.


Internals. You can manually copy all elements in your Dictionary. Internally, the Dictionary constructor that accepts IDictionary is implemented with this loop. My research established that the foreach loop is fast and eliminates lookups.

Also: You could easily adapt the loop to copy to a Hashtable or List of KeyValuePair structs.

KeyValuePair
Implementation of Dictionary copy constructor: C#

foreach (KeyValuePair<TKey, TValue> pair in dictionary)
{
    this.Add(pair.Key, pair.Value);
}


Summary. We copied an entire Dictionary to a new Dictionary. The Dictionary class does not define a Copy or CopyTo method. For this reason, using the copy constructor is the easiest and clearest way.

Also: We saw the internals of this constructor, which you can adapt to other collections if required.