lista - list.add c#
¿Por qué usar ICollection y no IEnumerable o List<T> en relaciones muchos-muchos/uno-muchos? (8)
Hay algunas diferencias básicas entre ICollection y IEnumerable
- IEnumerable : contiene solo el método GetEnumerator para obtener Enumerator y hacer un bucle
- ICollection contiene los siguientes métodos: Agregar / Eliminar / Contiene / Contar / CopyTo
- ICollection se hereda de IEnumerable
- Con ICollection puede modificar la colección utilizando los métodos como agregar / eliminar, no tiene la libertad de hacer lo mismo con IEnumerable.
Programa simple:
using System;
using System.Collections;
using System.Collections.Generic;
namespace StackDemo
{
class Program
{
static void Main(string[] args)
{
List<Person> persons = new List<Person>();
persons.Add(new Person("John",30));
persons.Add(new Person("Jack", 27));
ICollection<Person> personCollection = persons;
IEnumerable<Person> 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 string Name { get; set; }
public int Age { get; set; }
public Person(string name,int age)
{
this.Name = name;
this.Age = age;
}
}
}
Esto lo veo mucho en los tutoriales, con propiedades de navegación como ICollection<T>
.
¿Es este un requisito obligatorio para Entity Framework? ¿Puedo usar IEnumerable
?
¿Cuál es el propósito principal de usar ICollection
lugar de IEnumerable
o incluso List<T>
?
La idea básica de utilizar ICollection
es proporcionar una interfaz para acceder de forma predeterminada a una cantidad finita de datos. De hecho tienes una propiedad ICollection.Count . IEnumerable
es más adecuado para alguna cadena de datos donde se lee hasta algún punto lógico, alguna condición especificada por el consumidor o hasta el final de la enumeración.
Las propiedades de navegación generalmente se definen como virtuales para que puedan aprovechar ciertas funcionalidades de Entity Framework, como la carga lenta.
Si una propiedad de navegación puede contener varias entidades (como en relaciones de muchos a muchos o de uno a muchos), su tipo debe ser una lista en la que se puedan agregar, eliminar y actualizar entradas, como ICollection.
Lo que he hecho en el pasado es declarar mis colecciones de clase internas usando IList<Class>
, ICollection<Class>
o IEnumerable<Class>
(si es una lista estática) dependiendo de si tendré o no que hacer alguna de las siguientes IEnumerable<Class>
en una Método en mi repositorio: enumerar, ordenar / ordenar o modificar . Cuando solo necesito enumerar (y tal vez ordenar) los objetos, creo una List<Class>
temporal para trabajar con la colección dentro de un método IEnumerable. Creo que esta práctica solo sería efectiva si la colección es relativamente pequeña, pero puede ser una buena práctica en general, id. Corríjame si hay pruebas de por qué esto no sería una buena práctica.
Lo recuerdo de esta manera:
IEnumerable tiene un método GetEnumerator () que permite leer los valores de una colección pero no escribir en ellos. La mayor parte de la complejidad de usar el enumerador está a cargo de nosotros por cada declaración en C #. IEnumerable tiene una propiedad: Actual, que devuelve el elemento actual.
ICollection implementa IEnumerable y agrega algunas propiedades adicionales, la mayoría de las cuales es Count. La versión genérica de ICollection implementa los métodos Add () y Remove ().
IList implementa IEnumerable e ICollection.
Por lo general, lo que elija dependerá de los métodos a los que necesite acceder. En general, IEnumerable<>
(MSDN: http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx ) para una lista de objetos que solo necesita ser iterada a través de, ICollection<>
( MSDN: http://msdn.microsoft.com/en-us/library/92t2ye13.aspx ) para obtener una lista de objetos que se deben iterar y modificar, List<>
para obtener una lista de objetos que se deben iterar , modificado, ordenado, etc. (Consulte aquí para obtener una lista completa: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx ).
Desde un punto de vista más específico, la carga diferida viene a jugar con la elección del tipo. De forma predeterminada, las propiedades de navegación en Entity Framework vienen con seguimiento de cambios y son proxies. Para que el proxy dinámico se cree como una propiedad de navegación, el tipo virtual debe implementar ICollection
.
Una propiedad de navegación que representa el "muchos" final de una relación debe devolver un tipo que implementa ICollection, donde T es el tipo del objeto en el otro extremo de la relación. - Requisitos para crear POCO Proxies MSDN
Más información sobre la definición y gestión de relaciones MSDN
Respondiendo a su pregunta sobre la List<T>
:
List<T>
es una clase; Especificar una interfaz permite una mayor flexibilidad de implementación. Una mejor pregunta es "¿por qué no IList<T>
?"
Para responder a esa pregunta, considere lo que IList<T>
agrega a ICollection<T>
: indexación de enteros, lo que significa que los elementos tienen algún orden arbitrario, y se pueden recuperar por referencia a ese orden. Es probable que esto no sea significativo en la mayoría de los casos, ya que es probable que los elementos deban ordenarse de manera diferente en diferentes contextos.
ICollection<T>
se utiliza porque la IEnumerable<T>
no proporciona ninguna forma de agregar elementos, eliminar elementos o modificar la colección.