Самый простой способ - просто скопировать объекты:
var newDictionary = new OrderedDictionary();
foreach(DictionaryEntry de in orderedDictionary)
{
newDictionary.Add(de.Key, de.Value);
}
UPDATE:
Этот код НЕ создает глубокую копию значений в словаре.
Пример:
var orderedDictionary = new OrderedDictionary();
orderedDictionary.Add("1", new List<int> { 1, 2 });
var newDictionary = new OrderedDictionary();
foreach(DictionaryEntry de in orderedDictionary)
{
newDictionary.Add(de.Key, de.Value);
}
Оба словаря будут содержать одну запись с ключом «1» и тот же список. Удаление элемента из этого списка в любом из словарей также изменит содержимое списка в другом словаре, поскольку существует только один список.
Console.WriteLine(((List<int>)orderedDictionary["1"]).Count);
Console.WriteLine(((List<int>)newDictionary["1"]).Count);
Console.WriteLine(ReferenceEquals(orderedDictionary["1"], newDictionary["1"]));
((List<int>)orderedDictionary["1"]).Remove(1);
Console.WriteLine(((List<int>)orderedDictionary["1"]).Count);
Console.WriteLine(((List<int>)newDictionary["1"]).Count);
Это выведет следующее:
2
2
True
1
1
Назначение нового значения ключу в одном из словарей, однако не влияет на другой словарь:
newDictionary["1"] = new List<int>{3,4};
Console.WriteLine(ReferenceEquals(orderedDictionary["1"], newDictionary["1"]));
Console.WriteLine(((List<int>)orderedDictionary["1"]).Count);
Console.WriteLine(((List<int>)newDictionary["1"]).Count);
Будет выведено:
False
2
3