其他分享
首页 > 其他分享> > Cannot convert from an IEnumerable<T> to an ICollection<T>

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

作者:互联网

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

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?

 

回答1

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)

 

评论

ICollection<T> can be manipulated (see the doc for details), while an IEnumerable<T> can only be enumerated. – Anders Abel Jan 1, 2012 at 11:09    

You cannot convert directly from IEnumerable<T> to ICollection<T>. You can use ToList method of IEnumerable<T> to convert it to ICollection<T>

someICollection = SomeIEnumerable.ToList();

 

 

标签:index,convert,ToList,Items,ICollection,IEnumerable,Cannot
来源: https://www.cnblogs.com/chucklu/p/16669578.html