2013-11-21 14 views
10

Tôi có một số vấn đề lạ với Danh sách trong ứng dụng C# của tôi. Nó phải là một sai lầm phân bổ hoặc tôi đang làm điều gì đó sai (tôi là trung bình C# phát triển). Hãy để tôi đưa ra một ví dụ gần dòng của tôi:Vấn đề C# "vui" với Danh sách <String[]>

List<String[]> MyPrimaryList = new List<String[]>(); 
List<String[]> MySecondaryList = new List<String[]>(); 
String[] array; 

String arrayList = "one,two,three,four,five"; 
array = arrayList.Split(','); 

MyPrimaryList.Add(array); 
MySecondaryList.Add(array); 

MyPrimaryList[0][0] += "half"; 

Vì vậy, bây giờ tôi mong chờ giá trị đầu tiên trong mảng đầu tiên trong MyPrimaryList là "onehalf" và "một" trong MySecondaryList. Nhưng vấn đề/vấn đề của tôi là cả hai danh sách đều được cập nhật bằng "onehalf" làm giá trị đầu tiên trong mảng đầu tiên trong cả hai danh sách.

Bạn có giải thích đúng không? :)

THANKS !!

+1

Bạn đang thêm cùng một mảng để cả hai danh sách, vì vậy cả hai đều trỏ vào phần tử mảng mà bạn đang thay đổi. –

+0

Bạn đang thêm cùng một đối tượng vào cả hai danh sách - nói cách khác chỉ có một 'mảng' bạn không tạo bản sao ở bất kỳ đâu ... – tpeczek

Trả lời

18

String[] array; là một loại tài liệu tham khảo. Bạn đã thêm một tham chiếu đến vị trí trong bộ nhớ của đối tượng này vào cả hai danh sách, do đó cả hai đều giữ cùng một dữ liệu.

Nếu quý vị cần danh sách thứ hai để có một bản sao của array sau đó bạn có thể sử dụng Array.Copy:

List<String[]> MyPrimaryList = new List<String[]>(); 
List<String[]> MySecondaryList = new List<String[]>(); 

String arrayList = "one,two,three,four,five"; 
String[] array = arrayList.Split(','); 
String[] array2 = new string[5]; 

Array.Copy(array, array2, 5); 

MyPrimaryList.Add(array); 
MySecondaryList.Add(array2); 

MyPrimaryList[0][0] += "half"; 

Console.WriteLine(MyPrimaryList[0][0]); 
Console.WriteLine(MySecondaryList[0][0]); 

này có mảng nguồn, một mảng đích và thời gian - hãy cẩn thận để kiểm tra giới hạn mảng.

đầu ra này:

onehalf 
one 

Vì mỗi danh sách đang nắm giữ một tham chiếu đến một mảng khác nhau, bạn có thể thao tác các mục mảng độc lập.

9

Bạn đang thêm cùng một thể hiện của mảng vào cả hai danh sách, vì vậy chúng trỏ đến cùng cấu trúc bộ nhớ.

Nếu bạn muốn chúng độc lập, bạn cần sao chép chúng; Một cách nhanh chóng từ đỉnh đầu của tôi sẽ sử dụng linq list.Add(array.ToArray()) trong một trong các danh sách

+1

'. Chọn (x => x) 'là không cần thiết vì' chuỗi [] 'đã thực hiện' IEnumerable '. –

+0

@Eren, bạn nói đúng, tôi đã làm theo cách đó bởi vì không chắc chắn 100% rằng ToArray được gọi trên một mảng sẽ trả lại một bản sao mới. Nhưng tôi đã kiểm tra và đó là cách nó hoạt động –

7

Mảng là đối tượng tham chiếu để bạn sửa đổi cùng một bộ sưu tập trong bộ nhớ. Tất cả các bạn đang làm về cơ bản là thêm con trỏ đến cấu trúc tương tự,

Có xem xét tài liệu này

Passing Arrays as Arguments (C# Programming Guide)

Bạn sẽ cần phải làm một bản sao sâu của mảng để có được quyền tự chủ mà bạn muốn.

Bạn có thể làm điều này với Array.Copy

0

Bạn nên tạo một mảng cho mỗi danh sách bạn đang làm việc với vì ngay bây giờ bạn đang trỏ vào cấu trúc bộ nhớ cùng

mã đúng nên là:

List<String[]> MyPrimaryList = new List<String[]>(); 
List<String[]> MySecondaryList = new List<String[]>(); 
String[] array; 
String[] secondaryArray; 

String arrayList = "one,two,three,four,five"; 
array = arrayList.Split(','); 
secondaryArray = arrayList.Split(','); 

MyPrimaryList.Add(array); 
MySecondaryList.Add(secondaryArray); 

MyPrimaryList[0][0] += "half"; 

tại danh sách thứ hai của bạn sẽ có "một" và không "onehalf" như yếu tố đầu tiên

0

như mảng đề cập là một loại tài liệu tham khảo và do đó cả hai danh sách sẽ trỏ đến cùng một mảng


Để giải quyết vấn đề của bạn sử dụng Clone phương pháp ..

MyPrimaryList.Add((String[])array.Clone()); 
MySecondaryList.Add((String[])array.Clone()); 

Mặc dù nó sẽ làm một bản sao cạn của mảng đó nhưng nó phù hợp trong trường hợp của bạn

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