2012-02-08 40 views
6

Trong một trong các dự án của tôi, tôi đang cố xóa mục khỏi danh sách có id bằng id đã cho. Tôi có một BindingListXóa các phần tử khỏi danh sách ràng buộc

UserList 

Là một danh sách có một phương pháp

RemoveAll() 

Như ia có một BindingList vì vậy tôi sử dụng như thế

UserList.ToList().RemoveAll(x=>x.id==ID) 

Nhưng điều đó không làm việc và danh sách của tôi chứa cùng số mục như trước. Tại sao nó không hoạt động?

Trả lời

11

Nó không hoạt động vì bạn đang làm việc trên một bản sao của danh sách mà bạn đã tạo bằng cách gọi ToList.

BindingList không hỗ trợ RemoveAll, đó là một tính năng Danh sách chỉ, vì vậy:

var itemToRemove = UserList.Where(x => x.id == ID).ToList(); 
foreach (var item in itemToRemove) 
{ 
    UserList.Remove(item); 
} 

cần gọi ToList nếu không chúng tôi sẽ liệt kê một bộ sưu tập trong khi sửa đổi nó.

+0

@rafay này Chúng ta cần t o gọi ToList nếu không chúng tôi sẽ liệt kê một bộ sưu tập trong khi sửa đổi nó, nó sẽ tăng một ngoại lệ. Điều này là do việc thực hiện hoãn lại ở đâu. Nếu bạn làm việc trên một bản sao, danh sách gốc (UserList) sẽ không được cập nhật khi bạn gọi RemoveAll. –

+0

cảm ơn điều đó. –

2

Bạn có thể thử

UserList = UserList.Where(x => x.id == ID).ToList(); 

Điều này có thể giúp bạn

Nếu bạn sử dụng 'RemoveAll' bên trong một lớp chung mà bạn có ý định được sử dụng để giữ một bộ sưu tập của bất kỳ đối tượng loại, như thế này:

public class SomeClass<T> 

{ 
internal List<T> InternalList; 
public SomeClass() { InternalList = new List<T>(); } 


public void RemoveAll(T theValue) 
{ 
// this will work 
InternalList.RemoveAll(x =< x.Equals(theValue)); 

// the usual form of Lambda Predicate 
//for RemoveAll will not compile 
// error: Cannot apply operator '==' to operands of Type 'T' and 'T' 
// InternalList.RemoveAll(x =&amp;gt; x == theValue); 
} 
} 

từ MSDN bình luận: http://msdn.microsoft.com/en-us/library/wdka673a.aspx trên

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