70 votes

Qu'est-ce que IEnumerable en .net ?

Qu'est-ce que IEnumerable en .net ?

26 votes

Pour être honnête, la définition sur MSDN est très effrayante pour un débutant, quand tout ce que vous voulez faire est un foreach.

11 votes

Bien que je puisse comprendre pourquoi il a été fermé, je suis venu sur ce site depuis Google après que MSDN n'ait pas été très clair, et les réponses m'ont vraiment aidé. Si je le pouvais, je voterais pour la réouverture de ..... Ce sujet apparaît en tête de liste lorsqu'on cherche "What is IEnumerable" sur Google et je suis sûr que d'autres l'ont trouvé utile.

74voto

Joel Coehoorn Points 190579

C'est ... quelque chose ... sur lequel vous pouvez boucler. Il peut s'agir d'une liste, d'un tableau ou (presque) de n'importe quoi d'autre qui supporte une fonction foreach boucle. C'est pour quand vous voulez être capable d'utiliser un objet avec une foreach mais vous ne savez pas exactement à quel type vous avez affaire, que ce soit un tableau, une liste ou quelque chose de personnalisé.

C'est donc le premier avantage : si vos méthodes acceptent un IEnumerable plutôt qu'un tableau ou une liste, elles deviennent plus puissantes car vous pouvez leur passer plus de types d'objets différents.

Ce qui distingue vraiment IEnumerable, ce sont les blocs d'itérateurs (la fonction yield en C#). Les blocs itérateurs implémentent l'interface IEnumerable comme une liste ou un tableau, mais ils sont très spéciaux car, contrairement à une liste ou un tableau, ils ne conservent souvent l'état que pour un seul élément à la fois. Ainsi, si vous souhaitez parcourir en boucle les lignes d'un très gros fichier, par exemple, vous pouvez écrire un bloc itérateur pour gérer l'entrée du fichier. Ainsi, vous n'aurez jamais plus d'une ligne du fichier en mémoire à la fois, et si vous terminez la boucle plus tôt (il s'agissait peut-être d'une recherche et vous avez trouvé ce dont vous aviez besoin), vous n'aurez peut-être pas besoin de lire tout le fichier. Ou si vous lisez les résultats d'une grande requête SQL, vous pouvez limiter votre utilisation de la mémoire à un seul enregistrement.

Une autre caractéristique est que cette évaluation est paresseux Ainsi, si vous effectuez un travail compliqué pour évaluer l'énumérable au fur et à mesure que vous le lisez, ce travail n'a pas lieu tant qu'il n'est pas demandé. C'est un avantage supplémentaire, car souvent (par exemple, pour les recherches à nouveau), vous constaterez que vous n'avez pas besoin de faire ce travail du tout.

Vous pouvez penser à IEnumerable comme à une liste juste à temps.

1 votes

La clé de IEnumarable c'est que la collection de sauvegarde est not enumerated jusqu'à ce qu'il soit spécifiquement étendu, que ce soit un foreach ou un accesseur via un indexeur. Malheureusement, IEnumarable semble être utilisé aveuglément comme l'interface la plus basse, ce qui cause maintenant des problèmes avec la manipulation asynchrone des données (par exemple, l'exécution de SQL sur des contextes GarbageCollected). Je dirais que ICollection est tout ce que vous avez dit à part "l'évaluation paresseuse" et nous devrions l'utiliser, surtout si les données ont déjà été énumérées une fois !

1 votes

La meilleure explication simple en anglais clair, chapeau !

0 votes

Je pense que IEnumerable est mal nommé. Mathématiquement, et en informatique, un énumérable est tout ce qui correspond à un ensemble dénombrable. Ainsi, en dehors de .NET, une IObservable peut être énumérable. Dans .NET, IEnumerable est considéré comme le double opposé de IObservable dans une dualité pull vs push. L'intention d'IEnumerable semble être ce que Java appelle Iterable, qui à mon avis est un meilleur nom.

35voto

Justin Niessner Points 144953

Il s'agit d'une interface mise en œuvre par les types de collections dans .NET qui fournissent l'information suivante Modèle d'itérateur . Il existe aussi la version générique qui est IEnumerable<T> .

La syntaxe (que l'on voit rarement parce qu'il y a des façons plus jolies de le faire) pour se déplacer dans une collection qui implémente IEnumerable est :

IEnumerator enumerator = collection.GetEnumerator();

while(enumerator.MoveNext())
{
    object obj = enumerator.Current;
    // work with the object
}

Ce qui est fonctionnellement équivalent à :

foreach(object obj in collection)
{
    // work with the object
}

Si la collection prend en charge les indexeurs, vous pouvez également l'itérer avec la méthode classique de la boucle for, mais le modèle Iterator offre quelques avantages supplémentaires, comme la possibilité d'ajouter la synchronisation pour le threading.

0 votes

Notez que la syntaxe présentée ici est l'équivalent en C# 5 d'un foreach. Dans le C# 4 et les versions antérieures, le object obj; est déclaré en dehors de la boucle while, ce qui modifie le comportement de la boucle lorsqu'on travaille avec des éléments qui capturent des variables comme les fonctions anonymes.

0 votes

Une réponse de type "tech-over-tech" n'apporte que plus de confusion et de frustration.

13voto

David Basarab Points 25852

Il s'agit d'abord d'une interface. La définition selon MSDN est

Expose l'énumérateur, qui prend en charge d'une simple itération sur une collection non générique.

Dit d'une manière très simple, que tout objet implémentant cette interface fournira un moyen d'obtenir un énumérateur. Un énumérateur est utilisé avec la fonction foreach à titre d'exemple.

Une liste implémente l'interface IEnumerable.

    // This is a collection that eventually we will use an Enumertor to loop through
    // rather than a typical index number if we used a for loop.
    List<string> dinosaurs = new List<string>();

    dinosaurs.Add("Tyrannosaurus");
    dinosaurs.Add("Amargasaurus");
    dinosaurs.Add("Mamenchisaurus");
    dinosaurs.Add("Deinonychus");
    dinosaurs.Add("Compsognathus");

    Console.WriteLine();

    // HERE is where the Enumerator is gotten from the List<string> object
    foreach(string dinosaur in dinosaurs)
    {
        Console.WriteLine(dinosaur);
    }

    // You could do a 
    for(int i = 0; i < dinosaurs.Count; i++)
    {
        string dinosaur = dinosaurs[i];

        Console.WriteLine(dinosaur);
    }

Le foreach a l'air plus propre.

7voto

SWeko Points 17524

La réponse courte est que c'est tout ce que vous pouvez utiliser comme un foreach sur.

4 votes

Vous pouvez effectuer un foreach sur n'importe quoi avec une méthode GetEnumerator. Il n'est pas nécessaire qu'il supporte IEnumerable.

0 votes

Oui, mais la plupart du temps IEnumerable <==> foreach

0voto

  • Il s'agit d'une interface de base qui nous permet de boucler ou d'itérer sur une collection.

  • La remarque la plus importante concernant IEnumerable est que lorsque vous parcourez un objet ou une collection, il ne retient que l'état d'un seul élément à la fois.

  • Il a de bonnes performances lorsque vous itérez à travers de grands objets ou collections. car il ne charge pas l'objet entier en mémoire pour effectuer l'itération. par par exemple, supposons que vous décidiez de lire un gros fichier ligne par ligne et de faire quelque chose dessus. que, vous pouvez donc écrire votre propre ReaderEnumrable pour lire votre fichier avec de hautes performances.

  • Lorsque vous écrivez une requête à l'aide d'IEnumerable, vous utilisez les avantages de la méthode différée. et votre requête s'exécute au moment où vous y accédez.

  • Chaque fois que vous exécutez une itération dans une collection, une différente collection est créée. Par exemple, dans le code suivant, chaque fois que la collection listOfFiles a accédé au ListOfAllFiles exécuter à nouveau.

    public static void Main()
    {
        var listOfFiles = ListOfAllFiles();
    
        var filesCount = listOfFiles.Count();
        var filesAny = listOfFiles.Any();
        var fileIterate = listOfFiles.Select(x => x.FullName);
    }
    
    private static IEnumerable<FileInfo> ListOfAllFiles()
    {
        foreach(var file in Directory.EnumerateFiles(Environment.CurrentDirectory))
        {
            yield return new FileInfo(file);
        }
    }

0 votes

La plupart de vos hypothèses sont des caractéristiques du "rendement" et non spécifiquement d'IEnumerable. IEnumerable est juste une interface fournissant un moyen d'itération, rien d'autre.

0 votes

Vous utilisez yield return lors de l'utilisation de IEnumerable Ils sont donc complètement corrélés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X