无法从IEnumerable <T>转换为ICollection <T>
我已经定义了以下内容:
public ICollection<Item> Items { get; set; }
当我运行这个代码:
Items = _item.Get("001");
我收到以下消息:
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?)
有人能解释我做错了什么吗? 我对Enumerable,Collections和使用ToList()之间的区别很困惑,
增加了信息
后来在我的代码中,我有以下几点:
for (var index = 0; index < Items.Count(); index++)
我可以将项目定义为IEnumerable吗?
ICollection<T>
从IEnumerable<T>
ICollection<T>
inheritance,以便分配结果
IEnumerable<T> Get(string pk)
到ICollection<T>
有两种方法。
// 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();
第二个选项更灵活,但是性能影响要大得多。 另一个select是将结果存储为IEnumerable<T>
除非需要ICollection<T>
接口添加的额外function。
额外的性能评论
你有循环
for (var index = 0; index < Items.Count(); index++)
在IEnumerable<T>
但效率低下; 每次调用Count()
需要枚举所有元素。 要么使用集合和Count
属性(没有括号)或将其转换为foreach循环:
foreach(var item in Items)
您不能直接从IEnumerable<T>
转换为ICollection<T>
。 您可以使用IEnumerable<T>
ToList
方法将其转换为ICollection<T>
someICollection = SomeIEnumerable.ToList();
等待更多关于这个问题的信息:
请提供有关项目types和Get的签名的更多信息
你可以尝试两件事情是:
- 将_item.Get的返回值转换为(ICollection)
- 其次使用_item.Get(“001”)。ToArray()或_item.Get(“001”)。ToList()
请注意,第二个将会导致arrays副本的性能下降。 如果Get的签名(返回types)不是ICollection,那么第一个将不起作用,如果它不是IEnumerable,那么第二个将不起作用。
在澄清问题和意见之后,我会亲自向ICollection声明_item.Get(“001”)的返回types。 这意味着您不必进行任何投射或转换(通过ToList / ToArray),这将涉及不必要的创build/复制操作。
// Leave this the same public ICollection<Item> Items { get; set; } // Change function signature here: // As you mention Item uses the same underlying type, just return an ICollection<T> public ICollection<Item> Get(string value); // Ideally here you want to call .Count on the collectoin, not .Count() on // IEnumerable, as this will result in a new Enumerator being created // per loop iteration for (var index = 0; index < Items.Count(); index++)
最好的祝福,