2009-10-31 66 views
25

我有一个IEnumerable对象。我想根据索引访问例如:如何访问C#中IEnumerable对象的索引?

for(i=0; i<=Model.Products; i++) 
{ 
     ??? 
} 

这可能吗?

+0

@Avram的'IEnumerator'是想获得一个完全合理的事情一个项目的索引。 – Servy 2014-06-02 14:33:19

+0

@Servy IEnumerator的搭配IEnumerable的,需要添加的IEnumerable作为问题 – Avram 2014-06-02 14:43:07

+0

@Avram号的一部分,你*不*需要。他可以自由地询问他想询问的任何一个人。他选择询问“IEnumerator”,这是一个非常好的问题。仅仅因为这不是你想要回答/已经回答的问题,并不意味着你应该改变这个问题。 – Servy 2014-06-02 14:45:14

回答

19
var myProducts = Models.Products.ToList(); 
for(i=0; i< myProducts.Count ; i++) 
{ 
     //myProducts[i]; 
} 
+0

不应该是我 2009-10-31 12:19:17

+12

并且还要警惕.ToList()正在内存中创建一个新列表。那是值得的(所有的垃圾只是有一个指数?) – Nestor 2009-10-31 12:23:05

+2

这是非常讨厌的。因此,如果有10,000种产品,他需要第五,你告诉他先加载所有10K内存,只是放弃9554,他不会需要什么? – 2009-11-16 21:16:55

25

IEnumerator中没有索引。使用

foreach(var item in Model.Products) 
{ 
    ...item... 
} 

你可以让你自己的索引,如果你想:

所有的
int i=0; 
foreach(var item in Model.Products) 
{ 
    ... item... 
    i++; 
} 
8
foreach(var indexedProduct in Model.Products.Select((p, i)=> new {Product = p, Index = i}) 
{ 
    ... 
    ...indexedProduct.Product... 
    ...indexProduct.Index ...//this is what you need. 
    ... 
} 
86

首先,你确定这是真的IEnumerator而不是IEnumerable?我强烈怀疑它实际上是后者。

此外,该问题并不完全清楚。你有一个索引,并且你想获得该索引的一个对象吗?如果是这样,如果你确实有一个IEnumerable(不IEnumerator),你可以这样做:如果你想枚举整个集合

using System.Linq; 
... 
var product = Model.Products.ElementAt(i); 

,同时也希望为每个元素的索引,那么VA” s或Nestor的答案是你想要的。

0

通过索引检索项目的最好办法就是以这种方式使用LINQ数组引用您的枚举集合:

using System.Linq; 
... 
class Model { 
    IEnumerable<Product> Products; 
} 
... 
// Somewhere else in your solution, 
// assume model is an instance of the Model class 
// and that Products references a concrete generic collection 
// of Product such as, for example, a List<Product>. 
... 
var item = model.Products.ToArray()[index];