簡體   English   中英

如何創建字典副本 <int,List<int> &gt;而不影響原始(C#)?

[英]How do I create a copy of a Dictionary<int,List<int>> without affecting the original (C#)?

我在C#中使用字典,花了幾個小時弄清楚為什么我的程序不起作用,原因是當我操縱我制作的字典副本時,這些操縱也會影響原始的字典由於某種原因。

我將問題歸結為以下示例:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Dictionary<int, List<int>> D = new Dictionary<int, List<int>>();
        List<int> L1 = new List<int>(){ 1, 2, 3 };
        List<int> L2 = new List<int>() { 4, 5, 6 };
        D.Add(1,L1);
        D.Add(2,L2);
        Dictionary<int, List<int>> Dcopy = new Dictionary<int, List<int>>(D);
        Dcopy[1].Add(4);
    }
}

在此代碼中,當我將一個元素添加到副本中與鍵1對應的列表中時,該元素也會出現在原始字典中。

當我在線搜索時,它似乎與“引用類型”有關,建議的修復程序似乎總是包含類似於以下內容的代碼

Dictionary<int, List<int>> Dcopy = new Dictionary<int, List<int>>(D);

我確實將其包含在程序中,但是由於某些原因,這不起作用。

關於為什么它在我的情況下不起作用的任何建議,以及有關如何處理的任何建議?

最好的祝福。

您正在執行淺表副本,而不是深表副本。 基本上,您需要遍歷字典並創建新列表

var Dcopy = new Dictionary<int, List<int>>();
foreach (var entry in D)
{
    Dcopy.Add(entry.Key, new List<int>(entry.Value));
} 

或者您可以使用以下Linq代替foreach

var DCopy = D.ToDictionary(entry => entry.Key, entry => new List<int>(entry.Value));

由於您的列表包含int ,這是一種值類型,因此您無需“克隆”比列表更深的內容。 如果列表中包含引用類型,那么您還必須另外克隆它們,並可能一直克隆所有引用屬性。

字典副本構造函數對字典進行淺表復制。 由於值是列表(引用類型),因此不會克隆列表。 如果要進行拷貝,則還需要克隆值:

    Dictionary<int, List<int>> Dcopy = D.ToDictionary(kvp => kpv.Key,
                                                      kvp => kvp.Value.ToList());

由於值是值類型的集合,因此不需要關閉列表的內容-克隆列表本身就足夠了。 密鑰相同-它們是值類型,因此無需克隆。

如果不需要列表的深層副本,為什么不簡單使用.NET提供的構造函數,避免擴展調用呢?

Dictionary<int, List<int>> Dcopy = new Dictionary<int,List<int>>(D);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM