![](/img/trans.png)
[英]if i have a dictionary<string,list<int,int>>how can i access the key of this list in 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.