Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot convert from an IEnumerable<T> to an ICollection<T>

Tags:

c#

.net

I have defined the following:

public ICollection<Item> Items { get; set; } 

When I run this code:

Items = _item.Get("001"); 

I get the following message:

Error   3    Cannot implicitly convert type  'System.Collections.Generic.IEnumerable<Storage.Models.Item>' to  'System.Collections.Generic.ICollection<Storage.Models.Item>'.  An explicit conversion exists (are you missing a cast?) 

Can someone explain what I am doing wrong. I am very confused about the difference between Enumerable, Collections and using the ToList()

Added information

Later in my code I have the following:

for (var index = 0; index < Items.Count(); index++)  

Would I be okay to define Items as an IEnumerable?

like image 577
Samantha J T Star Avatar asked Jan 01 '12 10:01

Samantha J T Star


People also ask

What is the difference between ICollection and IEnumerable?

An IEnumerable supports filtering elements using where clause. ICollection is another type of collection, which derives from IEnumerable and extends it's functionality to add, remove, update element in the list.


1 Answers

ICollection<T> inherits from IEnumerable<T> so to assign the result of

IEnumerable<T> Get(string pk) 

to an ICollection<T> there are two ways.

// 1. You know that the referenced object implements `ICollection<T>`, //    so you can use a cast ICollection<T> c = (ICollection<T>)Get("pk");  // 2. The returned object can be any `IEnumerable<T>`, so you need to  //    enumerate it and put it into something implementing `ICollection<T>`.  //    The easiest is to use `ToList()`: ICollection<T> c = Get("pk").ToList(); 

The second options is more flexible, but has a much larger performance impact. Another option is to store the result as an IEnumerable<T> unless you need the extra functionality added by the ICollection<T> interface.

Additional Performance Comment

The loop you have

for (var index = 0; index < Items.Count(); index++) 

works on an IEnumerable<T> but it is inefficient; each call to Count() requires a complete enumeration of all elements. Either use a collection and the Count property (without the parenthesis) or convert it into a foreach loop:

foreach(var item in Items) 
like image 102
Anders Abel Avatar answered Oct 11 '22 15:10

Anders Abel