Pourquoi utiliser ICollection et non IEnumerable ou List dans de nombreuses relations / un-plusieurs?

Je le vois beaucoup dans les tutoriels, avec des propriétés de navigation comme ICollection .

Est-ce une exigence obligatoire pour Entity Framework? Puis-je utiliser IEnumerable ?

Quel est le but principal d’utiliser ICollection au lieu de IEnumerable ou même List ?

    Habituellement, ce que vous choisissez dépend des méthodes auxquelles vous devez accéder. En général – IEnumerable<> (MSDN: http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx ) pour une liste d’objects qui doivent uniquement être itérés, ICollection<> ( MSDN: http://msdn.microsoft.com/en-us/library/92t2ye13.aspx ) pour une liste d’objects à parcourir et à modifier, List<> pour une liste d’objects à parcourir par itération , modifié, sortingé, etc. (Voir ici la liste complète: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx ).

    D’un sharepoint vue plus spécifique, le chargement paresseux joue pour choisir le type. Par défaut, les propriétés de navigation dans Entity Framework sont fournies avec le suivi des modifications et sont des proxies. Pour que le proxy dynamic soit créé en tant que propriété de navigation, le type virtuel doit implémenter ICollection .

    Une propriété de navigation qui représente la fin “many” d’une relation doit renvoyer un type qui implémente ICollection, où T est le type de l’object à l’autre extrémité de la relation. – Conditions requirejses pour la création de proxy POCO MSDN

    Plus d’informations sur la définition et la gestion des relations MSDN

    ICollection est utilisé car l’interface IEnumerable ne permet pas d’append des éléments, de supprimer des éléments ou de modifier la collection.

    Répondant à votre question sur List :

    List est une classe; la spécification d’une interface permet une plus grande souplesse d’implémentation. Une meilleure question est “pourquoi pas IList ?”

    Pour répondre à cette question, considérez ce que IList ajoute à ICollection : indexation de nombre entier, ce qui signifie que les éléments ont un ordre arbitraire et peuvent être récupérés par référence à cet ordre. Ce n’est probablement pas significatif dans la plupart des cas, car les éléments doivent probablement être classés différemment selon les contextes.

    Il y a une différence de base entre ICollection et IEnumerable

    • IEnumerable – Contient uniquement la méthode GetEnumerator pour obtenir Enumerator et effectuer une boucle
    • ICollection contient les méthodes suivantes – Ajouter / Supprimer / Contient / Count / CopyTo
    • ICollection est hérité de IEnumerable
    • Avec ICollection, vous pouvez modifier la collection en utilisant les méthodes telles que add / remove, vous n’avez pas la liberté de faire la même chose avec IEnumerable.

    Programme simple:

     using System; using System.Collections; using System.Collections.Generic; namespace StackDemo { class Program { static void Main(ssortingng[] args) { List persons = new List(); persons.Add(new Person("John",30)); persons.Add(new Person("Jack", 27)); ICollection personCollection = persons; IEnumerable personEnumeration = persons; //IEnumeration //IEnumration Contains only GetEnumerator method to get Enumerator and make a looping foreach (Person p in personEnumeration) { Console.WriteLine("Name:{0}, Age:{1}", p.Name, p.Age); } //ICollection //ICollection Add/Remove/Contains/Count/CopyTo //ICollection is inherited from IEnumerable personCollection.Add(new Person("Tim", 10)); foreach (Person p in personCollection) { Console.WriteLine("Name:{0}, Age:{1}", p.Name, p.Age); } Console.ReadLine(); } } class Person { public ssortingng Name { get; set; } public int Age { get; set; } public Person(ssortingng name,int age) { this.Name = name; this.Age = age; } } } 

    L’idée de base de l’utilisation d’ ICollection est de fournir une interface permettant d’accéder en lecture seule à une quantité limitée de données. En fait, vous avez une propriété ICollection.Count . IEnumerable est plus adapté à certaines chaînes de données où vous lisez jusqu’à un point logique, certaines conditions spécifiées explicitement par le consommateur ou jusqu’à la fin de l’énumération.

    Je m’en souviens de cette façon:

    1. IEnumerable a une méthode GetEnumerator () qui permet de lire les valeurs d’une collection sans y écrire. La complexité de l’utilisation de l’énumérateur est prise en charge pour nous par chaque instruction en C #. IEnumerable a une propriété: Current, qui renvoie l’élément en cours.

    2. ICollection implémente IEnumerable et ajoute peu de propriétés supplémentaires dont la plus grande utilisation est Count. La version générique de ICollection implémente les méthodes Add () et Remove ().

    3. IList implémente à la fois IEnumerable et ICollection.

    Ce que j’ai fait dans le passé est de déclarer mes collections de classes internes en utilisant IList , ICollection ou IEnumerable (si la liste est statique) selon que je devrai faire un nombre quelconque de méthode dans mon référentiel: énumérer, sortinger / ordonner ou modifier . Quand j’ai juste besoin d’énumérer (et peut-être de sortinger) des objects, je crée une List temporaire List pour travailler avec la collection dans une méthode IEnumerable. Je pense que cette pratique ne serait efficace que si la collection est relativement petite, mais cela peut être une bonne pratique en général, idk. S’il vous plaît corrigez-moi s’il y a des preuves pour lesquelles cela ne serait pas une bonne pratique.

    Les propriétés de navigation sont généralement définies comme virtuelles afin qu’elles puissent tirer parti de certaines fonctionnalités d’Entity Framework, telles que le chargement différé.

    Si une propriété de navigation peut contenir plusieurs entités (comme dans les relations plusieurs-à-plusieurs ou un-à-plusieurs), son type doit être une liste dans laquelle des entrées peuvent être ajoutées, supprimées et mises à jour, telles que ICollection.

    https://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net- application mvc