Question

When we declare a parameter as ICollection and instantiated the object as List, why we can't retrive the indexes? i.e.

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

Then, this will not work:

ProductDTO product = (ProductDTO)Products[0];

What is the bit I am missing?
[Yes, we can use List as declaration an it can work, but I don't want to declare as list, like:

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

]

Was it helpful?

Solution

The ICollection interface doesn't declare an indexer, so you can't use indexing to fetch elements through a reference of that type.

You could perhaps try IList, which adds some more functionality, while still being abstract. Of course, this may impact other design decisions so I would look at this carefully.

OTHER TIPS

Using LINQ, you can do this:

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

ICollection does not define an indexer.

ICollection Non-Generic

ICollection Generic

Then this will work:

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

The reason is that the compiler evaluates the lvalue, that is the variable on the left side of '=', to find out which methods and properties it knows it can access at compile-time. This is known as static typing, and ensures that an object member can be accessed directly at runtime by statically knowing that the member is always reachable.

The basic problem is that ICollection doesn't define an index. For the List this is done by the implementation of IList.

Try this:

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

Alternatly, you can keep using ICollection and convert to an array when you need to access the elements by the index:

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

Using Linq, you can access an element in an ICollection<> at a specific index like this:

myICollection.AsEnumerable().ElementAt(myIndex);

You can also use extension methods to convert it to (list, array) of ProductDTO

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

Then you can use it like that:

productsList[index]
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top