21

当我们将参数声明为 ICollection 并将对象实例化为 List 时,为什么我们不能检索索引?IE

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>();

]

4

7 回答 7

38

使用 LINQ,您可以这样做:

ProductDTO product = (ProductDTO)Products.ElementAt(0);
于 2012-04-23T22:50:52.987 回答
29

ICollection接口没有声明索引器,因此您不能使用索引通过该类型的引用来获取元素。

您也许可以尝试IList,它添加了更多功能,同时仍然是抽象的。当然,这可能会影响其他设计决策,所以我会仔细研究。

于 2009-12-09T17:59:39.577 回答
7

ICollection 没有定义索引器。

ICollection 非通用

ICollection 通用

于 2009-12-09T17:58:55.983 回答
5

然后这将起作用:

ProductDTO product = ((IList<ProductDTO>)Products)[0];

原因是编译器评估左值,即“=”左侧的变量,以找出它知道在编译时可以访问哪些方法和属性。这称为静态类型化,并通过静态知道该成员始终可访问来确保可以在运行时直接访问对象成员。

于 2009-12-09T18:24:05.130 回答
3

基本问题是 ICollection 没有定义索引。对于 List,这是通过 IList 的实现来完成的。

试试这个:

IList<ProductDTO> Products = new List<ProductDTO>(); 

或者,当您需要通过索引访问元素时,您可以继续使用 ICollection 并转换为数组:

ICollection<ProductDTO> Products = new List<ProductDTO>();        
ProductDTO z = Products.ToArray()[0];
于 2009-12-09T18:07:54.210 回答
2

使用 Linq,您可以访问 ICollection<> 中特定索引处的元素,如下所示:

myICollection.AsEnumerable().ElementAt(myIndex);
于 2018-01-06T12:23:22.570 回答
0

您还可以使用扩展方法将其转换为ProductDTO的 (list, array)

ICollection<ProductDTO> Products = new List<ProductDTO>();
var productsList = Products.ToList();

然后你可以像这样使用它:

productsList[index]
于 2018-10-18T17:27:32.847 回答