2010-07-19 33 views

Trả lời

34

Sử dụng LINQ:

prods.Remove(prods.Single(s => s.ID == 1)); 

Có lẽ bạn thậm chí muốn sử dụng SingleOrDefault() và kiểm tra xem phần tử tồn tại ở tất cả các ...

EDIT:
stuff là cấu trúc, SingleOrDefault() sẽ không trả về giá trị rỗng. Nhưng nó sẽ trở lại mặc định (công cụ), mà sẽ có một ID của 0. Khi bạn không có một ID từ 0 cho bình thường thứ-đối tượng của bạn, bạn có thể truy vấn cho ID này:

var stuffToRemove = prods.SingleOrDefault(s => s.ID == 1) 
if(stuffToRemove.ID != 0) 
{ 
    prods.Remove(stuffToRemove); 
} 
+0

Khá chắc chắn Remove (null) ném một ngoại lệ mà quy định ra SingleOrDefault, nơi nó được. –

+1

@Graphain: Tôi đã thêm một ví dụ cho bạn – tanascius

0

Bạn chỉ có thể loại bỏ một cái gì đó bạn có một tham chiếu đến. Vì vậy, bạn sẽ phải tìm kiếm toàn bộ danh sách:

stuff r; 
foreach(stuff s in prods) { 
    if(s.ID == 1) { 
     r = s; 
     break; 
    } 
} 
prods.Remove(r); 

hoặc

for(int i = 0; i < prods.Length; i++) { 
    if(prods[i].ID == 1) { 
     prods.RemoveAt(i); 
     break; 
    } 
} 
+0

không phải là nhanh hơn khi sử dụng hàm find hoặc findIndex trên danh sách thay vì lặp qua nó? – Rob

+1

Bạn không thể sửa đổi bộ sưu tập bạn đang lặp lại –

+0

@Rob, cho Danh sách, hãy tìm kiếm phải giống nhau. –

3

Nếu bạn có LINQ:

var itemtoremove = prods.Where(item => item.ID == 1).First(); 
prods.Remove(itemtoremove) 
+0

Bạn có thể đặt truy vấn 'where' làm tham số cho First() –

0

prods.Remove(prods.Single(p=>p.ID == 1));

bạn không thể sửa đổi bộ sưu tập trong foreach, như Vincent gợi ý

+0

Single sẽ chậm hơn lần đầu tiên nhưng nó đảm bảo bạn không có sản phẩm trùng lặp cho cùng một ID có thể là thứ bạn muốn kiểm tra. –

0

Bạn có thể sử dụng LINQ.

var prod = from p in prods 
      where p.ID != 1 
      select p; 
+0

Thao tác này sẽ không xóa đối tượng. Nếu bạn chỉ định như 'prods = prods.Where (p! = 1) .ToList()' bạn gần hơn, nhưng điều đó sẽ không sửa đổi danh sách bạn đã đưa ra dưới dạng tham số. –

119

Nếu loại bộ sưu tập của bạn là một List<stuff>, sau đó phương pháp tốt nhất có lẽ là như sau:

prods.RemoveAll(s => s.ID == 1) 

này chỉ thực hiện một đường chuyền (lặp) trên danh sách, vì vậy nên có hiệu quả hơn so với khác phương pháp.

Nếu loại của bạn là tổng quát hơn là ICollection<T>, bạn có thể viết phương pháp mở rộng ngắn nếu bạn quan tâm đến hiệu suất. Nếu không, sau đó bạn có thể có được bằng cách sử dụng LINQ (gọi Where hoặc Single).

+9

Ai đó có thể đánh dấu câu trả lời này là chính xác không? –

+1

Câu trả lời này phải được chấp nhận. –

+1

Câu trả lời này không thể được chấp nhận vì IList không có RemoveAll. Bộ khởi động chủ đề không chỉ định những gì anh ta/cô ấy có: Danh sách hoặc IList . –

1
prods.Remove(prods.Find(x => x.ID == 1)); 
Các vấn đề liên quan