lista generic array c# list indexing icollection

c# - generic - ¿Por qué el índice de ICollection no funciona cuando se crea una instancia?



lista c# (7)

Cuando declaramos un parámetro como ICollection y creamos una instancia del objeto como Lista, ¿por qué no podemos recuperar los índices? es decir

ICollection<ProductDTO> Products = new List<ProductDTO>(); Products.Add(new ProductDTO(1,"Pen")); Products.Add(new ProductDTO(2,"Notebook"));

Entonces, esto no funcionará:

ProductDTO product = (ProductDTO)Products[0];

¿Qué es lo que me falta?
[Sí, podemos usar Lista como declaración y puede funcionar, pero no quiero declarar como lista, como:

List<ProductDTO> Products = new List<ProductDTO>();

]


El problema básico es que ICollection no define un índice. Para la Lista, esto se hace mediante la implementación de IList.

Prueba esto:

IList<ProductDTO> Products = new List<ProductDTO>();

Alternativamente, puede seguir utilizando ICollection y convertirlo a una matriz cuando necesite acceder a los elementos mediante el índice:

ICollection<ProductDTO> Products = new List<ProductDTO>(); ProductDTO z = Products.ToArray()[0];


Entonces esto funcionará:

ProductDTO product = ((IList<ProductDTO>)Products)[0];

La razón es que el compilador evalúa el valor l , que es la variable en el lado izquierdo de ''='', para averiguar a qué métodos y propiedades sabe que puede acceder en tiempo de compilación. Esto se conoce como escritura estática y garantiza que se pueda acceder directamente a un miembro objeto en tiempo de ejecución sabiendo de manera estática que siempre se puede acceder al miembro.



La interfaz de ICollection no declara un indexador, por lo que no puede usar la indexación para obtener elementos a través de una referencia de ese tipo.

Tal vez podría probar IList , que agrega algunas funciones más, a la vez que sigue siendo abstracto. Por supuesto, esto puede afectar otras decisiones de diseño, así que lo vería con cuidado.


También puede usar métodos de extensión para convertirlo a (lista, matriz) de ProductDTO

ICollection<ProductDTO> Products = new List<ProductDTO>(); var productsList = Products.ToList();

Entonces puedes usarlo así:

productsList[index]


Usando LINQ, puedes hacer esto:

ProductDTO product = (ProductDTO)Products.ElementAt(0);


Usando Linq, puede acceder a un elemento en un ICollection <> en un índice específico como este:

myICollection.AsEnumerable().ElementAt(myIndex);