2013-07-16 31 views
10

Trong một nơi tôi đang sử dụng danh sách các chuỗi trong trường hợp đó, tôi có thể thay đổi giá trị của chuỗi như mã đưa ra dưới đây,Thay đổi giá trị đối tượng trong vòng lặp foreach?

foreach(string item in itemlist.ToList()) 
{ 
    item=someValue; //I am able to do this 
} 

Nhưng đối với đối tượng của lớp tôi không thể thay đổi thành viên giá trị của đối tượng mã là như dưới đây,

public class StudentDTO 
{ 
    string name; 
    int rollNo; 
} 

studentDTOList=GetDataFromDatabase(); 

foreach(StudentDTO student in studentDTOList.ToList()) 
{ 
     studentDTO=ChangeName(studentDTO); //Not working 
} 

private StudentDTO ChangeName(StudentDTO studentDTO) 
{ 
    studentDTO.name=SomeName; 
    return studentDTO; 
} 

Lỗi là: không thể gán bởi vì nó lặp biến

+9

Không, bạn thực sự không thể thực hiện mã trong đoạn mã đầu tiên. Biến lặp lại là chỉ đọc. –

+0

tôi có thể làm vì .ToList() tạo bản sao của danh sách và lặp qua bản sao đó để nó hoạt động –

+0

Không, bạn không thể làm điều đó. Hãy thử nó. Mã * sẽ không biên dịch *. Nếu bạn thực sự tin rằng nó sẽ, xin vui lòng sản xuất một chương trình ngắn nhưng đầy đủ chứng minh rằng - bạn sẽ thấy nó không thành công. –

Trả lời

16

Bạn không thể thay đổi biến lặp của vòng lặp foreach, nhưng bạn có thể thay đổi thành viên của biến lặp. Do đó thay đổi phương pháp ChangeName để

private void ChangeName(StudentDTO studentDTO) 
{ 
    studentDTO.name = SomeName; 
} 

Lưu ý rằng studentDTO là một loại tài liệu tham khảo. Do đó không cần phải trả lại sinh viên đã thay đổi. Phương thức ChangeName nhận được, không phải là bản sao của học sinh mà là một tham chiếu đến đối tượng sinh viên duy nhất. Biến lặp và studentDTOList đều tham chiếu cùng một đối tượng sinh viên cũng như tham số studentDTO của phương thức.

Và thay đổi vòng lặp để

foreach(StudentDTO student in studentDTOList) 
{ 
    ChangeName(student); 
} 

Tuy nhiên, các phương pháp như ChangeName là không bình thường. Con đường để đi là để đóng gói lĩnh vực này trong một tài sản

private string name; 
public string Name 
{ 
    get { return name; } 
    set { name = value; } 
} 

Sau đó bạn có thể thay đổi vòng lặp để

foreach(StudentDTO student in studentDTOList) 
{ 
    student.Name = SomeName; 
} 

EDIT

Trong một bình luận bạn nói rằng bạn phải thay đổi nhiều trường. Trong trường hợp đó, sẽ không sao nếu có phương thức UpdateStudent sẽ thực hiện tất cả các thay đổi; tuy nhiên tôi vẫn giữ các đặc tính.

Nếu không có logic bổ sung trong thuộc tính ngoài việc chuyển qua một giá trị, bạn có thể thay thế chúng bằng các thuộc tính được tự động triển khai tiện dụng.

public string Name { get; set; } 

Trong trường hợp đó, bạn sẽ phải thả trường name.

+0

ya tôi đã làm điều đó rồi tôi chỉ quên đề cập đến nó trong câu hỏi ... –

+1

vì vậy tôi không phải trả lại bất cứ điều gì từ chức năng vì nó đã nhận được loại tham chiếu của đối số –

+1

Có. Ngay cả khi bạn trả lại sinh viên, bạn có thể bỏ qua giá trị trả về một cách an toàn và không gán nó cho biến lặp. Việc trả lại học sinh cho phép bạn kết nối các cuộc gọi phương thức: 'student.UpdateValues ​​(). StoreChanges(). PrintReport(); ' –

17

bạn đang không thực sự thay đổi đối tượng mà bạn đang đề cập đến dù sao, vì vậy bạn chỉ có thể sử dụng:

foreach (StudentDTO student in studentDTOList) 
{ 
    student.name = SomeName; 
} 

Hoặc vẫn gọi một phương thức:

foreach (StudentDTO student in studentDTOList) 
{ 
    ChangeStudent(student); 
} 

Trong cả hai trường hợp, mã số không thay đổi giá trị của biến lặp (student) do đó, nó không sao.

Nhưng ví dụ ban đầu của bạn chưa biên dịch - biến lặp được giới thiệu bởi vòng lặp foreach là chỉ đọc.

+0

sẽ là riêng tư hiện tại nhưng +1 một trong hai cách – Sayse

+0

Thực tế tôi đang đưa ra một ví dụ cho mã mã ban đầu của tôi đang thay đổi rất nhiều giá trị từ biến đó nhưng với máy bay foreach() nó không làm việc nó cho thấy lỗi. –

+1

@ user2553512: "nó hiển thị lỗi" là * không bao giờ đủ thông tin ... và thay đổi rất nhiều dữ liệu trong đối tượng, bạn không thể chỉ định giá trị mới cho biến lặp. Vì vậy, bạn có thể gọi 'ChangeStudent (sinh viên)' sẽ thay đổi dữ liệu - bạn không thể làm 'student = ChangeStudent (student)'. –