2013-08-15 16 views
5

Có một danh sách các đối tượng với cấu trúc đối tượng như saubất động sản Cập nhật trong bộ sưu tập tượng với LINQ

public class Schedule 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 

    public Schedule() {} 
} 

Thực thi một truy vấn LINQ trên dữ liệu tôi có thể xem danh sách dân cư đúng đối tượng

var schedule = (from d in data 
       select new Schedule 
       { 
        ID = d.id, 
        Name = "" 
       }).ToList(); 

sau trong mã Tôi muốn thay đổi tên thuộc tính phụ thuộc vào một điều kiện. Một vài ví dụ tôi đã tìm thấy

schedule.ForEach(s => { s.Name = "Condition Name"; }); 
schedule.Select(s => { s.Name = "Condition name"; return s; }); 

sau khi thực hiện để lại Thông số tên "null" khi tôi làm mới lịch biểu trong cửa sổ xem. Có ai có thể thấy có vấn đề gì với điều này không?

Looping qua bộ sưu tập và cố gắng để thay đổi thuộc tính không thay đổi nó hoặc

foreach (var sch in schedule) 
    { 
     sch.Name = "New name"; 
    } 

schedule.ToList() [0] .name == ""

CẬP NHẬT

.ToList() gọi trong đoạn dưới đây là rất quan trọng để làm cho mã làm việc.

var schedule = (from d in data 
       select new Schedule 
       { 
        ID = d.id, 
        Name = "" 
       }).ToList(); 
+2

Để bắt đầu, bạn đang thực hiện một lựa chọn mới và chỉ truy xuất ID –

+0

@MrJones bị thiếu nhưng trong mã tôi chọn trong đối tượng – Maxim

+0

Có, nhưng bạn chỉ đặt thuộc tính ID. Bạn nên làm một cái gì đó như '(từ d trong dữ liệu chọn lịch trình mới {ID = d.ID, Tên = d.Name}). ToList()'. Nếu không, 'scehdule.Name' sẽ là null. –

Trả lời

3

Mã này hoạt động - sau khi thực hiện schedule.ForEach() Tên tài sản được cập nhật. Có thể có thứ gì đó mà bạn đã bỏ đi.

3

LINQ không phải là công cụ thích hợp để sửa đổi bộ sưu tập, nó là công cụ để truy vấn bộ sưu tập. Nếu bạn muốn thay đổi nó, bạn cần một vòng lặp, ví dụ như một foreach:

var schedule = data.Select(d => new Schedule{ ID = d.id }).ToList(); 
foreach(var s in schedule) 
    s.Name = "Condition Name"; 

Nếu bạn muốn "thay đổi", một bộ sưu tập với LINQ bạn phải tạo một hình mới và gán cho biến của bạn mà không hiệu quả .

+0

Về mặt lý thuyết nên làm việc nhưng để lại không thay đổi cuối cùng. Đã cập nhật câu hỏi. – Maxim

+0

@Maxim: 'schedule.ToList()' tạo luôn một danh sách mới. –

+0

Lỗi của tôi với ví dụ về mã, được đề cập trong phần cập nhật câu hỏi. Cảm ơn mọi người. Upvotes. – Maxim

4

Truy vấn LINQ của bạn gán giá trị cho schedule tạo đối tượng độc lập dựa trên bộ sưu tập gốc (nó sao chép các đối tượng một cách hiệu quả); thay đổi các thuộc tính của các dòng vô tính không thay đổi các đối tượng gốc.

0

Dưới đây, bạn tạo mới Schedules mà không cần đặt Name.

var schedule = (from d in data 
       select new Schedule 
       { 
        ID = d.id 
       }).ToList(); 

Để bắt đầu, bạn có thể muốn cung cấp cho các mới Schedules một Name

var schedule = (from d in data 
       select new Schedule 
       { 
        ID = d.id, 
        Name = d.NameProperty /* Switch out with real name property */ 
       }).ToList();