2009-09-01 8 views
6

S'il vous plaît considérer le code suivant:IEnumerable: Ce qui est-ce que cela signifie dans le contexte de la POO

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

IEnumerable <Person> people; 

Aussi je l'ai vu dans de nombreux programmes quelque chose comme <IQueryable> qu'est-ce que cela signifie?

Quelle est la signification de IEnumerable<Person> ici?

+3

IEnumerable est un type .Net, et non un terme OOP – Gishu

+0

BTW, c'est OOP (Object Oriented Programming) pas OOPS. J'ai édité pour le réparer cependant. – Aamir

+0

@Amir vous avez raison. Je plaide la diffusion sémantique :) - cependant si vous demandez à Alan Kay et à d'autres personnes distinguées, OOPS est apte pour ce qu'il est devenu. – Gishu

Répondre

4

IEnumerable<T>

Il de différentes façons qu'un ensemble de choses peut être stocké, dans une liste, dans un tableau, dans une base de données, etc. Une chose que ces mécanismes de stockage ont en commun est que l'ensemble de choses étant détenu peut être Enumerated, qui est chacun peut être consulté l'un après l'autre en utilisant un langage de construction tel que foreach par exemple.

L'interface IEnumerable<T> représente cette interface commune que tous les détenteurs d'ensembles de choses doivent activer l'énumération.Par conséquent IEnumberable<Person représente une interface qui permet l'énumération d'un ensemble d'objets Person sans être précis sur la manière dont ces objets sont stockés.

IQueryable<T>

Ceci est une extension à IEnumerable<T> mais représente quelque chose de spécifique à LINQ. Dans LINQ, vous pouvez spécifier une requête pouvant filtrer et transformer un ou plusieurs ensembles d'éléments. Contre une interface purement IEnumerable<T> cela serait connu comme LINQ to Objects, dans lequel chaque étape de la requête est finalement un simple appel à une méthode d'extension.

Cependant, par rapport à un objet qui implémente IQueryable<T>, les choses peuvent être plus sophistiquées. L'objet implémentant IQueryable<T> peut être associé à un autre fournisseur LINQ qui peut implémenter l'exécution de requêtes LINQ d'une manière différente. Par exemple, IQueryable<Person> peut être implémenté par un type associé au fournisseur LINQ-To-SQL. Dans ce cas, une requête LINQ est transformée en une requête T-SQL exécutée sur une base de données pour obtenir un ensemble d'éléments (le résultat ne doit pas nécessairement être un ensemble d'objets Person).

+0

Une des meilleures réponses en anglais simple – Edwards

3

IEnumerable ne veut rien dire dans le contexte de la POO.

IEnumerable et IEnumerable<T> sont des interfaces .NET qui indiquent simplement qu'une séquence peut être énumérée. Les classes qui implémentent IEnumerable ou IEnumerable<T> fournissent des propriétés/méthodes pour rendre cette énumération possible.

Par exemple:

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 étend IEnumerable et est destiné à être mis en œuvre par les fournisseurs LINQ. Vous pouvez exécuter des requêtes sur n'importe quel fournisseur, c'est-à-dire sur les fournisseurs abstraits de diff via cette interface. Il étend IEnumerable pour que les résultats de la requête puissent être itérés. par exemple. boucle sur tous les objets avec personne LastName.equals (« Smith »)

IEnumerable<People> signifie que la variable fait référence à un objet qui vous permettra d'itérer/énumérez/boucle sur une collection d'objets Personne

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

C'est un peu compliqué à expliquer (Jon Skeet fait un excellent travail dans ce livre). Un type implémentant IEnumerable déclare que je peux vous donner un objet itérateur (via la méthode d'interface GetEnumerator) exposant une interface IEnumerator, que vous pouvez utiliser pour accéder à l'élément Current de la collection et MoveNext pour passer à l'élément suivant dans la liste. la construction foreach appelle en interne les opérations ci-dessus pour atteindre son but.
Voir the example in MSDN, implémentez un itérateur vous-même et ce sera plus clair.

0

IEnumerable<T> est un type d'infrastructure .NET. Il représente juste une séquence énumérable d'éléments sans aucune méthode pour manipuler la séquence. De nombreux types implémentent cette interface - par exemple ICollection<T>, IList<T> et BindingList<T> - et il est communément utilisé à la place du type concret d'un champ ou d'une variable si la séquence doit être traitée comme étant en lecture seule.

Questions connexes