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