Bạn có thể sử dụng (có thể đánh giá được, nhưng được đánh giá một cách lười biếng) Select
, trước tiên thực hiện thao tác của bạn và sau đó trả lại danh tính (hoặc một cái gì đó khác nếu bạn muốn)
IEnumerable<string> people = new List<string>(){"alica", "bob", "john", "pete"};
people.Select(p => { Console.WriteLine(p); return p; });
Bạn sẽ cần đảm bảo rằng nó vẫn được đánh giá, bằng Count()
(hoạt động rẻ nhất để liệt kê afaik) hoặc hoạt động khác mà bạn cần dù sao đi nữa.
Tôi rất thích nhìn thấy nó được đưa vào thư viện tiêu chuẩn:
static IEnumerable<T> WithLazySideEffect(this IEnumerable<T> src, Action<T> action) {
return src.Select(i => { action(i); return i; } );
}
Các mã trên sau đó trở thành people.WithLazySideEffect(p => Console.WriteLine(p))
tương đương hiệu quả với foreach, nhưng lười biếng và có thể xâu chuỗi.