2010-07-19 33 views
9

Nếu tôi giải thích tính năng ForEach sau cho ai đó, có phải chính xác để nói rằng số 2 là phương pháp "LINQ foreach" "hoặc đơn giản là" List<T> phương pháp mở rộng "không được liên kết chính thức với LINQ ?Phần nào của ngôn ngữ C# là .ForEach()?

var youngCustomers = from c in customers 
        where c.Age < 30 
        select c; 

//1. traditional foreach approach 
foreach (var c in youngCustomers) 
{ 
    Console.WriteLine(c.Display()); 
} 

//2. LINQ foreach approach? 
youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display())); 
+3

Kiểm tra bài đăng này từ Eric Lippert http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx –

+1

Cần lưu ý rằng số 2 của bạn sẽ lặp lại các mục hai lần - một lần để tạo danh sách và một lần cho phương thức ForEach.Nếu bạn muốn sử dụng kiểu mã đó, điều này hoàn toàn hợp pháp, bạn nên viết phương thức mở rộng ForEach của riêng mình trên IEnumerable. –

Trả lời

24

it is a normal method of List<T> dù mọi người thường cung cấp các phương pháp khuyến nông của riêng mình cho IEnumerable<T> khác. LINQ does not provide a ForEach extension do mục tiêu thiết kế của nó là chức năng/làm việc với các loại bất biến, ForEach là một tác dụng phụ vốn có/hoạt động bắt buộc.

+0

đây là những gì tôi nghi ngờ nhưng không chắc chắn vì nếu bạn thực hiện tìm kiếm trên google cho "linq foreach" thì có vẻ là quan niệm sai lầm. .FEEach() là một tính năng của LINQ –

10

Không có gì liên quan đến LINQ và nó không phải là một phương pháp mở rộng.

ForEach là phương pháp mẫu đơn giản trên lớp List<T>.

(Và nếu bạn muốn trở thành thực sự nitpicky, sau đó ForEach không phải là một phần của ngôn ngữ C# ở tất cả: nó là một phần của .NET Cơ sở Class Library).

+0

Thư viện lớp cơ sở (BCL) aka Thư viện lớp khung (FCL) – abatishchev

+0

@abatishchev: Sự hiểu biết của tôi là BCL và FCL không đồng nghĩa. FCL là một superset của BCL. Xem http://en.wikipedia.org/wiki/Base_Class_Library và http://en.wikipedia.org/wiki/Framework_Class_Library. – LukeH

+0

Yea, tôi thấy cả hai. Tôi nghĩ rằng hai bài viết này phần nào không rõ ràng. Tôi không biết tại sao Microsoft chưa chỉnh sửa chúng. Theo sau bài báo, BCL chỉ chứa các không gian tên chuẩn hóa của ECMA trong khi đó FCL - tất cả các không gian tên chuẩn. Đúng? – abatishchev

2

Nó không phải là một phương pháp mở rộng của List<T>, nó là một phương pháp thông thường của List<T>.

Vì vậy, nó không liên quan gì đến LINQ. Nếu nó có, sự khác biệt giữa "chính thức liên kết với LINQ" và không chính thức liên kết với LINQ không thực tế là một trong rất hữu ích. LINQ chỉ đơn giản là một loạt các phương pháp mở rộng xích (thường là trên IEnumerable<T>). Ít khi có bất kỳ điểm nào trong việc phân biệt nó với các phương pháp mở rộng khác trên IEnumerable<T>. Sự khác biệt tốt nhất là họ cư trú tại một trong các không gian tên System.Linq hoặc System.Something.Linq.

1
youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display())); 

Hãy phá vỡ nó xuống:

  • ToList là một lời kêu gọi System.Linq.Enumerable.ToList() giới thiệu trong khuôn khổ .net 3.5
  • ForEach là cuộc gọi đến System.Collections.Generic.List<T>.ForEach được giới thiệu trong .net framework 2.0
  • c => là cú pháp biểu thức lambda được giới thiệu trong C# 3.0.

Nếu bạn xem tài liệu cho List<T>.ForEach, bạn có thể xem cú pháp đại biểu cũ được yêu cầu ngược lại để gọi nó.

0

Tác dụng phụ foreach sẽ được (được) cung cấp trong tiện ích Linq của Visual Studio 2010.

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