IEnumerable: что это значит в контексте ООП - PullRequest
6 голосов
/ 01 сентября 2009

Пожалуйста, обратите внимание на следующий код:

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

IEnumerable <Person> people;

Также я видел во многих программах что-то вроде <IQueryable> что это значит?

Что означает IEnumerable<Person> здесь?

Ответы [ 4 ]

4 голосов
/ 01 сентября 2009

IEnumerable<T>

Существует множество способов хранения набора вещей в Списке, Массиве, Базе данных и т. Д. Общим для этих механизмов хранения является то, что набор вещей может быть Enumerated , то есть каждая из них может быть доступна одна за другой с использованием языковой конструкции, такой как, например, foreach.

Интерфейс IEnumerable<T> представляет тот общий интерфейс, который все владельцы наборов вещей должны включить перечисление. Следовательно, IEnumberable<Person представляет интерфейс, который позволяет перечислять набор Person объектов, не говоря уже о том, каким образом эти объекты хранятся.

IQueryable<T>

Это расширение IEnumerable<T>, но оно представляет собой что-то специфическое для LINQ. В LINQ вы можете указать запрос , который может фильтровать и преобразовывать набор (или наборы) элементов. В отличие от чисто IEnumerable<T> интерфейса это будет называться LINQ to Objects, в котором каждый этап запроса в конечном итоге представляет собой простой вызов метода расширения.

Однако с объектом, который реализует IQueryable<T>, все может быть более изощренным. Объект, реализующий IQueryable<T>, может быть связан с другим провайдером LINQ , который может реализовывать выполнение запросов LINQ другим способом. Например, IQueryable<Person> может быть реализовано типом, связанным с поставщиком LINQ-To-SQL. В этом случае запрос LINQ преобразуется в запрос T-SQL, выполняемый для базы данных, чтобы получить набор элементов (результат не обязательно может быть набором Person объектов).

3 голосов
/ 01 сентября 2009

IEnumerable ничего не значит в контексте ООП.

IEnumerable и IEnumerable<T> являются интерфейсами .NET, которые просто указывают, что последовательность может быть перечислена. Классы, которые реализуют IEnumerable или IEnumerable<T>, предоставляют свойства / методы, чтобы сделать это перечисление возможным.

Например:

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 голосов
/ 01 сентября 2009

IEnumerable<T> - это тип платформы .NET. Он просто представляет перечисляемую последовательность элементов без каких-либо методов для манипулирования этой последовательностью. Многие типы реализуют этот интерфейс - например, ICollection<T>, IList<T> и BindingList<T> - и он обычно используется вместо конкретного типа поля или переменной, если последовательность должна обрабатываться только для чтения.

0 голосов
/ 01 сентября 2009

IQueryable расширяет IEnumerable и предназначен для реализации поставщиками LINQ. Вы можете выполнять запросы к любому провайдеру, то есть абстрагироваться от провайдеров diff через этот интерфейс. Он расширяет IEnumerable, так что результаты запроса могут быть повторены. например цикл по всем объектам Person с LastName.equals ("Smith")

IEnumerable<People> означает, что переменная ссылается на объект, который позволит вам выполнять итерацию / перечисление / цикл по коллекции объектов Person

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

Это немного сложно объяснить (Джон Скит проделал огромную работу в этом в своей книге). Тип, реализующий IEnumerable, в основном заявляет, что я могу предоставить вам объект итератора (через метод интерфейса GetEnumerator), предоставляющий интерфейс IEnumerator, который можно использовать для доступа к элементу Current в коллекции и MoveNext для перехода к следующему элементу в списке. конструкция foreach внутренне вызывает вышеуказанные операции для достижения своей цели.
См. пример в MSDN , самостоятельно внедрите итератор, и это будет более понятно.

...