How do I copy the content of a dictionary to an new dictionary in C#?
66,063
Solution 1
Assuming you mean you want them to be individual objects, and not references to the same object pass the source dictionary into the destination's constructor:
Dictionary<string, string> d = new Dictionary<string, string>();
Dictionary<string, string> d2 = new Dictionary<string, string>(d);
"so that they are not the same object."
Ambiguity abound - if you do actually want them to be references to the same object:
Dictionary<string, string> d = new Dictionary<string, string>();
Dictionary<string, string> d2 = d;
(Changing either d
or d2
after the above will affect both)
Solution 2
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
Dictionary<string, string> first = new Dictionary<string, string>()
{
{"1", "One"},
{"2", "Two"},
{"3", "Three"},
{"4", "Four"},
{"5", "Five"},
{"6", "Six"},
{"7", "Seven"},
{"8", "Eight"},
{"9", "Nine"},
{"0", "Zero"}
};
Dictionary<string, string> second = new Dictionary<string, string>();
foreach (string key in first.Keys)
{
second.Add(key, first[key]);
}
first["1"] = "newone";
Console.WriteLine(second["1"]);
}
}
Solution 3
A one-line version of Amal's answer:
var second = first.Keys.ToDictionary(_ => _, _ => first[_]);
Author by
hansgiller
Updated on July 09, 2022Comments
-
hansgiller almost 2 years
How can I copy a
Dictionary<string, string>
to anothernew Dictionary<string, string>
so that they are not the same object? -
stuicidle almost 7 yearsJust as a side note, something that tripped me up once. If you use this method to copy a static dictionary, then changes made in the copy will still effect the original
-
Saeed Ganji about 5 yearsanother approach could be found stackoverflow.com/questions/139592/…
-
Granger over 2 yearsCurious: Why didn't you do this instead?
var second = first.ToDictionary(kvp => k.Key, kvp => kvp.Value);
-
Zodman over 2 yearsWhen performance is not critical and I'm faced with different possibilities for syntax, I go for the version I believe is easier to read. I believe explicitly using
first.Keys.ToDictionary(_
reads better thanfirst.ToDictionary(kvp=> k.Key
because it reads more fluently and the variable names are not required to describe intent (hence the use of the underscore/discard). So mine is the Keys offirst
as a dictionary, then I look at the last parameter and see the values are just the values by key. Your syntax with discards works too:first.ToDictionary(_ => _.Key, _ => _.Value)