2009-09-01 28 views
6

Hãy xem xét đoạn mã sau:IEnumerable: Whats có nghĩa là trong bối cảnh OOP

public class Person 
(
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
    Public int Age {get; set;} 
} 

IEnumerable <Person> people; 

Ngoài ra tôi đã thấy trong nhiều chương trình giống như <IQueryable> có nghĩa là gì?

Ý nghĩa của IEnumerable<Person> ở đây là gì?

+3

IEnumerable là loại .Net, không phải là cụm từ OOPs – Gishu

+0

BTW, đó là OOP (Lập trình hướng đối tượng) không phải OOPS. Tôi đã chỉnh sửa để sửa chữa nó mặc dù. – Aamir

+0

@Aamir bạn nói đúng. tôi cầu xin sự phổ biến ngữ nghĩa :) - tuy nhiên nếu bạn hỏi Alan Kay và một số người nổi tiếng khác, OOPS là thích hợp cho những gì nó đã đến được. – Gishu

Trả lời

4

IEnumerable<T>

Có nhiều cách khác nhau mà một bộ điều thể được lưu trữ trong một danh sách, trong một mảng, trong một cơ sở dữ liệu vv Một điều mà các cơ chế lưu trữ có điểm chung là bộ những thứ đang được giữ có thể là Được liệt kê, mỗi cái có thể được truy cập cái này sau cái khác bằng cách sử dụng cấu trúc ngôn ngữ chẳng hạn như foreach chẳng hạn.

Giao diện IEnumerable<T> thể hiện giao diện chung mà tất cả các chủ sở hữu của bộ điều phải bật điều tra.Do đó IEnumberable<Person đại diện cho một giao diện cho phép đếm một Tập hợp các đối tượng Person mà không cần cụ thể về cách thức thực tế mà các đối tượng đó được lưu trữ.

IQueryable<T>

Đây là một phần mở rộng để IEnumerable<T> nhưng đại diện cho một cái gì đó cụ thể để LINQ. Trong LINQ, bạn có thể chỉ định một truy vấn có thể lọc và chuyển đổi một tập hợp (hoặc bộ) của các mục. Đối với giao diện thuần túy là IEnumerable<T>, nó sẽ được gọi là LINQ to Objects, trong đó mỗi giai đoạn trong truy vấn cuối cùng là một lời gọi đơn giản đến một phương thức mở rộng.

Tuy nhiên đối với đối tượng triển khai IQueryable<T> mọi thứ có thể phức tạp hơn. Đối tượng thực hiện IQueryable<T> có thể được liên kết với một Nhà cung cấp LINQ khác nhau có thể triển khai thực hiện truy vấn LINQ theo cách khác. Ví dụ: IQueryable<Person> có thể được triển khai bằng loại được liên kết với nhà cung cấp LINQ-To-SQL. Trong trường hợp này, truy vấn LINQ được chuyển thành truy vấn T-SQL được thực thi dựa vào cơ sở dữ liệu để nhận một tập hợp các mục (kết quả có thể không nhất thiết là một tập hợp các đối tượng Person).

+0

Một trong những câu trả lời hay nhất bằng tiếng Anh đơn giản – Edwards

3

IEnumerable không có nghĩa là bất kỳ điều gì trong ngữ cảnh OOP.

IEnumerableIEnumerable<T> là các giao diện .NET chỉ đơn giản chỉ ra rằng một chuỗi có thể được liệt kê. Các lớp thực hiện IEnumerable hoặc IEnumerable<T> cung cấp các thuộc tính/phương pháp để có thể liệt kê điều đó.

Ví dụ:

IEnumerable<Person> people = GetPeopleFromSomewhere(); 

// iterate through the sequence 
foreach (Person p in people) 
{ 
    Console.WriteLine(p.Name); 
} 

// use LINQ to query the sequence 
var peopleOver30 = people.Where(p => p.Age > 30); 
0

IQueryable mở rộng IEnumerable và được thiết kế để được thực hiện bởi các nhà cung cấp LINQ. Bạn có thể thực hiện các truy vấn đối với bất kỳ nhà cung cấp nào - tức là các nhà cung cấp dịch vụ khác nhau trừu tượng qua giao diện này. Nó mở rộng IEnumerable để các kết quả của Query có thể được lặp lại. ví dụ. vòng lặp qua tất cả các đối tượng Person với LastName.equals ("Smith")

IEnumerable<People> có nghĩa là biến dùng để chỉ một đối tượng mà sẽ cho phép bạn lặp/liệt kê/lặp trên một tập hợp các đối tượng Person

foreach(Person person in people) 
    Console.WriteLine(person.ToString()); 

Đó là một chút phức tạp để giải thích (Jon Skeet làm một công việc tuyệt vời này trong cuốn sách của mình). Một kiểu triển khai thực hiện IEnumerable về cơ bản tuyên bố rằng tôi có thể cung cấp cho bạn một đối tượng iterator (thông qua phương thức giao diện GetEnumerator) hiển thị giao diện IEnumerator, bạn có thể sử dụng để truy cập phần tử Current trong bộ sưu tập và MoveNext để chuyển sang phần tử tiếp theo trong danh sách. foreach xây dựng nội bộ gọi các hoạt động trên để đạt được mục đích của nó.
Xem the example in MSDN, Tự mình thực hiện một trình lặp và sẽ rõ ràng hơn.

0

IEnumerable<T> là loại khung .NET. Nó chỉ đại diện cho một chuỗi các phần tử không đếm được mà không có bất kỳ phương pháp nào để thao tác chuỗi. Nhiều loại thực hiện giao diện này - ví dụ: ICollection<T>, IList<T>BindingList<T> - và nó thường được sử dụng thay cho loại bê tông của trường hoặc biến nếu chuỗi được coi là chỉ đọc.

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