2010-02-25 6 views
14

Когда-нибудь в VB.NET у меня есть что-то вроде:vb.net: индекс в «для каждого»

For Each El in Collection 
    Write(El) 
Next 

Но если мне нужно индексный номер, я должен изменить его

For I = 0 To Collection.Count() - 1 
    Write(I & " = " & Collection(I)) 
Next 

Или даже (хуже)

I = 0 
For Each El In Collection 
    Write(I & " = " & El) 
    I += 1 
Next 

есть еще один способ получения индекса?

+0

Что еще хуже о перечисленных вами параметрах? Вы находите их менее понятными семантически? Вы беспокоитесь о производительности? –

+0

просто интересно, потому что я знаю, что VB хранит скрытую индексную переменную. лучшим вариантом будет доступ к нему. но похоже, что это невозможно. – ariel

ответ

21

Если вы используете общую коллекцию (Collection (of T)), вы можете использовать IndexOf method.

For Each El in Collection 
    Write(Collection.IndexOf(El) & " = " & El) 
Next 
+5

Неужели это будет довольно низкая производительность? Он должен искать всю коллекцию, чтобы получить Индекс. – ariel

+8

Я понятия не имею, что такое производительность. Если вы в основном заинтересованы в производительности, вам необходимо обновить свой вопрос, чтобы это отразить. –

+5

ОК .. Не нужно грубить. просто интересно :) – ariel

3

Если вам нужен индекс, то цикл for является наиболее простым вариантом и имеет отличную производительность. Помимо упомянутых вами альтернатив, вы можете использовать перегруженный метод Select для отслеживания индексов и продолжения использования цикла foreach.

Dim list = Enumerable.Range(1, 10).Reverse() ''# sample list 
Dim query = list.Select(Function(item, index) _ 
          New With { .Index = index, .Item = item }) 
For Each obj In query 
    Console.WriteLine("Index: {0} -- Item: {1}", obj.Index, obj.Item) 
Next 

Однако я бы придерживался цикла for, если единственная причина - перебрать его и узнать индекс. Вышеописанное не дает понять, почему вы решили пропустить цикл for.

5

Я считаю, что ваш оригинальный способ сделать это с помощью счетной переменной - это самый эффективный способ сделать это. Использование Linq или IndexOf убьет производительность.

Dim i as Integer = 0 
For Each obj In myList 
    'Do stuff 
    i+=1 
Next 
+0

Согласовано. Подождите, пока VB не включит «Для каждого объекта в MyList с индексом i»;;) –

Смежные вопросы