2009-10-31 20 views
25

Tôi có một đối tượng IEnumerable. Tôi muốn truy cập dựa trên chỉ mục ví dụ:Cách truy cập chỉ mục trong đối tượng IEnumerable trong C#?

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

Điều này có thể không?

+0

@Avram Một 'IEnumerator' là một điều hoàn toàn hợp lý để muốn có được chỉ mục của một mục. – Servy

+0

@Servy IEnumerator kết hợp với IEnumerable, cần thêm IEnumerable như một phần của câu hỏi – Avram

+0

@Avram Không, bạn * không * cần. Anh ta tự do hỏi về bất cứ ai anh ta muốn hỏi. Anh ta chọn hỏi về 'IEnumerator', đó là một câu hỏi hoàn hảo để hỏi. Chỉ vì đó không phải là câu hỏi mà bạn muốn trả lời/đã trả lời không có nghĩa là bạn nên thay đổi câu hỏi này. – Servy

Trả lời

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

không nên là i

+12

và cũng beaware .ToList() đang tạo danh sách mới trong bộ nhớ. Đó có phải là giá trị nó (tất cả những gì lãng phí chỉ để có một chỉ số?) – Nestor

+2

Đó là khá khó chịu. Vì vậy, nếu có 10.000 sản phẩm, và anh ta cần thứ 5, bạn nói với anh ta để tải tất cả 10k vào bộ nhớ đầu tiên, chỉ để loại bỏ 9.554 anh ta sẽ không cần? –

25

Không có chỉ mục trong IEnumerator. Sử dụng

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

bạn có thể làm chỉ số của riêng bạn nếu bạn muốn:

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

Trước hết, bạn có chắc nó thực sự IEnumerator và không IEnumerable? Tôi mạnh mẽ nghi ngờ nó thực sự là sau này.

Ngoài ra, câu hỏi không hoàn toàn rõ ràng. Bạn có một chỉ mục, và bạn muốn nhận được một đối tượng tại chỉ mục đó? Nếu như vậy, và nếu thực sự bạn có một IEnumerable (không IEnumerator), bạn có thể làm điều này:

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

Nếu bạn muốn liệt kê toàn bộ sưu tập, mà còn muốn có một chỉ số cho mỗi phần tử, sau đó VA' s hoặc câu trả lời của Nestor là những gì bạn muốn.

0

Cách tốt nhất để lấy một mục bởi chỉ số này để tham khảo bộ sưu tập đếm được của bạn với một mảng sử dụng LINQ theo cách này:

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]; 
Các vấn đề liên quan