无法从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++) 

最好的祝福,