当我们将参数声明为ICollection并将对象实例化为List时,为什么我们无法检索索引?即。
ICollection<ProductDTO> Products = new List<ProductDTO>();
Products.Add(new ProductDTO(1,"Pen"));
Products.Add(new ProductDTO(2,"Notebook"));
然后,这不起作用:
ProductDTO product = (ProductDTO)Products[0];
我错过了什么?
[是的,我们可以使用List作为声明,它可以工作,但我不想声明为列表,如:
List<ProductDTO> Products = new List<ProductDTO>();
答案 0 :(得分:32)
使用LINQ,您可以这样做:
ProductDTO product = (ProductDTO)Products.ElementAt(0);
答案 1 :(得分:27)
ICollection接口未声明索引器,因此您无法使用索引通过该类型的引用获取元素。
您可以尝试IList,这会增加更多功能,同时仍然是抽象的。当然,这可能会影响其他设计决策,所以我会仔细研究。
答案 2 :(得分:7)
答案 3 :(得分:4)
然后这将起作用:
ProductDTO product = ((IList<ProductDTO>)Products)[0];
原因是编译器评估左值,即'='左侧的变量,以找出它知道它的方法和属性可以在编译时访问。这称为静态类型,并确保可以在运行时通过静态地知道该成员始终可访问来直接访问对象成员。
答案 4 :(得分:3)
基本问题是ICollection没有定义索引。对于List,这是通过IList的实现来完成的。
试试这个:
IList<ProductDTO> Products = new List<ProductDTO>();
另外,当您需要通过索引访问元素时,您可以继续使用ICollection并转换为数组:
ICollection<ProductDTO> Products = new List<ProductDTO>();
ProductDTO z = Products.ToArray()[0];
答案 5 :(得分:2)
使用Linq,您可以访问ICollection中的元素&lt;&gt;在这样的特定指数:
myICollection.AsEnumerable().ElementAt(myIndex);
答案 6 :(得分:0)
您还可以使用扩展方法将其转换为 ProductDTO
的(列表,数组)ICollection<ProductDTO> Products = new List<ProductDTO>();
var productsList = Products.ToList();
然后您可以像这样使用它:
productsList[index]