Как вы клонируете словарь в .NET? - PullRequest
38 голосов
/ 17 февраля 2010

Я знаю, что нам лучше использовать словари, а не хеш-таблицы. Я не могу найти способ клонировать словарь, хотя. Даже если я приведу его к ICollection, который я делаю, чтобы получить SyncRoot, который, как я знаю, тоже не одобряется.

Я сейчас занят этим изменением. Я правильно полагаю, что нет никакого способа реализовать какое-либо клонирование универсальным способом, поэтому клон не поддерживается для словаря?

Ответы [ 3 ]

57 голосов
/ 17 февраля 2010

Используйте конструктор, который принимает словарь. Смотрите этот пример

var dict = new Dictionary<string, string>();

dict.Add("SO", "StackOverflow");

var secondDict = new Dictionary<string, string>(dict);

dict = null;

Console.WriteLine(secondDict["SO"]);

И просто для удовольствия .. Вы можете использовать LINQ! Это немного более общий подход.

var secondDict = (from x in dict
                  select x).ToDictionary(x => x.Key, x => x.Value);

Редактировать

Это должно хорошо работать с ссылочными типами, я попробовал следующее:

internal class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public User Parent { get; set; }
}

И модифицированный код сверху

var dict = new Dictionary<string, User>();

dict.Add("First", new User 
    { Id = 1, Name = "Filip Ekberg", Parent = null });

dict.Add("Second", new User 
    { Id = 2, Name = "Test test", Parent = dict["First"] });

var secondDict = (from x in dict
                  select x).ToDictionary(x => x.Key, x => x.Value);

dict.Clear();

dict = null;

Console.WriteLine(secondDict["First"].Name);

Какие выходы "Филип Экберг".

2 голосов
/ 17 февраля 2010

Это быстрый и грязный метод клонирования, который я однажды написал ... Первоначальная идея, по-моему, из CodeProject.

Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Binary

Public Shared Function Clone(Of T)(ByVal inputObj As T) As T
    'creating a Memorystream which works like a temporary storeage '
    Using memStrm As New MemoryStream()
        'Binary Formatter for serializing the object into memory stream '
        Dim binFormatter As New BinaryFormatter(Nothing, New StreamingContext(StreamingContextStates.Clone))

        'talks for itself '
        binFormatter.Serialize(memStrm, inputObj)

        'setting the memorystream to the start of it '
        memStrm.Seek(0, SeekOrigin.Begin)

        'try to cast the serialized item into our Item '
        Try
            return DirectCast(binFormatter.Deserialize(memStrm), T)
        Catch ex As Exception
            Trace.TraceError(ex.Message)
            return Nothing
        End Try
    End Using
End Function

Useage:

Dim clonedDict As Dictionary(Of String, String) = Clone(Of Dictionary(Of String, String))(yourOriginalDict)
0 голосов
/ 17 января 2019

Просто, если кому-то нужна версия vb.net

Dim dictionaryCloned As Dictionary(Of String, String)
dictionaryCloned  = (From x In originalDictionary Select x).ToDictionary(Function(p) p.Key, Function(p) p.Value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...