2010-01-16 48 views
16

Làm thế nào tôi có thể sao chép đối tượng từ điển bằng giá trị trong C#Sao chép từ điển theo giá trị

+0

Bạn có nghĩa là bản sao chép sâu (tức là sao chép tất cả các đối tượng trong từ điển) không? – Paolo

Trả lời

27

Tạo mới Dictionary đi qua các từ điển nguồn trong các nhà xây dựng (tất nhiên, điều này sẽ không sao chép các đối tượng có trong từ điển nếu họ là các loại tài liệu tham khảo):

var copied = new Dictionary<KeyType, ValueType>(originalDictionary); 
-1

Không có phương pháp nội tại để làm điều đó. Bạn sẽ phải làm điều đó bằng tay.

Bước đầu tiên là quyết định mức độ sâu bạn muốn bản sao ghép nối. Bạn có muốn đối tượng mục nhập từ điển riêng biệt giữ tham chiếu đến các khóa chung & giá trị hay bạn muốn sao chép mọi thứ. Nếu sau này, họ sẽ cần phải thực hiện ICloneable để tạo ra một phương pháp mục đích chung.

+3

Cảnh báo! Chỉ vì một lớp thực hiện 'ICloneable' không có nghĩa là 'Clone' thực hiện một bản sao sâu. – jason

4
Using System.Linq; 
Dictionary<int, string> dict2 = dict1.ToDictionary(k => k.Key, k => k.Value.ToString()); 

Điều này sẽ tạo bản sao giống hệt của từ điển theo giá trị (không phải ref), vì vậy bạn có thể hoạt động trên một từ điển mà không thay đổi cài đặt khác.

+0

Đóng góp luôn được chào đón, nhưng các câu trả lời mới nên thêm thứ gì đó * đáng kể * trên các câu trả lời trước đó. Cho rằng câu hỏi này đã được trả lời .. vài năm trước, bạn nên suy nghĩ xem liệu nó có đáng sống lại chỉ để gửi mã được tạo bởi một dịch giả mã trực tuyến ;-) – Leigh

+0

Câu trả lời ban đầu của tôi là công việc của riêng tôi, tuy nhiên nó được viết bằng hình ảnh căn bản. Tôi chỉ đơn giản là tham chiếu trình chuyển đổi mã vì đây là một vấn đề đơn giản mà bất cứ ai cũng có thể làm. Giống như, "Hãy để tôi google cho bạn." Bây giờ, về tầm quan trọng. LINQ hoạt động tốt hơn trong mọi tình huống. Câu trả lời của tôi vượt trội so với câu trả lời ban đầu. Tôi đã xem qua bài đăng này sau nhiều năm, và câu trả lời ban đầu là không thỏa đáng cho tính chuyên nghiệp mà công ty tôi mong đợi. Tôi đã đăng câu trả lời để có thể giúp ai đó trong tương lai. Vì vậy, họ không phải làm điều gì đó theo cách thức hoạt động kém – Aaron

+0

Tôi không cố gắng cho bạn một thời gian khó khăn, nhưng thẳng thắn tham chiếu một bộ chuyển đổi mã đã làm cho âm thanh như bạn không quen với ngôn ngữ và đang đăng cái gì đó chưa được thử. Đó có thể không phải là trường hợp nào cả, nhưng đó là nhận thức. Re: * LINQ hoạt động tốt hơn trong mọi tình huống. Re: * Câu trả lời của tôi vượt trội so với câu trả lời gốc * Nếu đó là câu trả lời hay hơn, vui lòng cập nhật câu trả lời của bạn để cho biết lý do. – Leigh

Các vấn đề liên quan