2010-07-07 25 views
21

Có cách nào để gọi một phương thức trên mọi đối tượng trong Danh sách - ví dụ:Generics - gọi một phương thức trên mọi đối tượng trong Danh sách <T>

Thay vì

List<MyClass> items = setup(); 

foreach (MyClass item in items) 
    item.SomeMethod(); 

Bạn có thể làm một cái gì đó giống như

foreach(items).SomeMethod(); 

Bất cứ điều gì được xây dựng trong, phương pháp khuyến nông, hay tôi chỉ là quá damn lười biếng?

Trả lời

41

Vâng, trên List<T>, có:

items.ForEach(item => item.SomeMethod()) 

Các kỳ quặc là điều này chỉ có sẵn trên List<T>, không IList<T> hoặc IEnumerable<T>

Để khắc phục điều này, tôi muốn thêm phương thức mở rộng sau:

public static class IEnumerableExtensions 
{ 
    public static void ForEach<T>(this IEnumerable<T> items, Action<T> action) 
    { 
     foreach(var item in items) 
      action(item); 
    } 
} 

Sau đó, bạn có thể sử dụng tính năng này bất kỳ khi nào thực hiện IEnumerable<T> ... không chỉ List<T>

+0

Làm cách nào tôi bỏ lỡ .ForEach ... tổng hợp ngày của tôi hôm nay! Phương pháp mở rộng tốt đẹp. – Ryan

15
items.ForEach(i => i.SomeMethod()); 
+0

Đây có phải là mới trong phiên bản 4.0 không? –

+1

@Rosarch: Không. http://msdn.microsoft.com/en-us/library/bwabdf9z.aspx lưu ý rằng coderush sẽ đề xuất điều này như là một sự thay đổi từ foreach (var x trong các mục) x.SomeMethod(); –

+0

@Brian Genisio ya tôi nghĩ rằng tôi đã nhận thấy/cố định đồng thời với nhận xét của bạn ... –

4

Danh sách có phương thức ForEach. Bạn cũng có thể tạo một phương thức mở rộng IEnumerable, but it kind of goes against the spirit of Linq.

+0

Tất nhiên, là một trong những người bình luận trên bài viết đó, đôi khi không có thay thế (gọn gàng) cho ForEach. Tuy nhiên, nếu nó chỉ là để gọi một hoặc hai phương pháp trên đối tượng _every_ trong một container, sử dụng foreach cổ điển thực sự là con đường để đi. –

1

Nếu bạn cần thay đổi một tài sản trên MyClass sử dụng MyMethod, sử dụng phương pháp 'ống' từ Jon Skeet morelinq library

items = items.Pipe<MyClass>(i => i.Text = i.UpdateText()).ToList() 

Các khả năng là vô tận! :)

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