For Each...Next Deyimi (Visual Basic)
Bir grup ifadeleri koleksiyonundaki her öğe için yinelenir.
For Each element [ As datatype ] In group
[ statements ]
[ Continue For ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ element ]
Bölümleri
Terim |
Tanım |
element |
Gerekli For Each ifadesi.İsteğe bağlı Next ifadesi.Değişken.Koleksiyon öğeleri boyunca yineleme yapmak için kullanılır. |
datatype |
Gerekli if element bildirilen değildir.Veri türü element. |
group |
Gerekli.Bir koleksiyon türü veya nesne türüne sahip bir değişken.Derlemeye başvuruda bulunduğu statements yinelenmesi üzeresiniz. |
statements |
İsteğe Bağlı.Bir ya da daha fazla ifadeyi arasında For Each ve Next her öğe üzerinde çalışan group. |
Continue For |
İsteğe Bağlı.Denetim başlangıcına aktarır For Each döngü. |
Exit For |
İsteğe Bağlı.İşyeri aktarır For Each döngü. |
Next |
Gerekli.Tanımını sonlandırır For Each döngü. |
Basit bir örnek
Use a For Each...Next döngü deyimleri kümesini bir koleksiyon veya dizi her öğe için yinelemek istediğiniz zaman.
İpucu |
---|
A For...Next Deyimi (Visual Basic) , her döngü tekrarında kontrol değişkeni ile ilişkilendirmek ve değişkenin ilk ve son değerleri belirlemek iyi çalışır.Bununla birlikte, bir koleksiyonu ile uğraşırken kavramı, ilk ve son değerleri anlamlı değildir, ve kaç öğe koleksiyonu vardır mutlaka bilmiyorum.Bu tür bir durumda, bir For Each...Next döngüsü ise genellikle daha iyi bir seçimdir. |
Aşağıdaki örnekte, For Each...Next ifadesi bir liste koleksiyonu tüm öğeleri yineler.
' Create a list of strings by using a
' collection initializer.
Dim lst As New List(Of String) _
From {"abc", "def", "ghi"}
' Iterate through the list.
For Each item As String In lst
Debug.Write(item & " ")
Next
Debug.WriteLine("")
'Output: abc def ghi
Daha fazla örnek için bkz: Koleksiyonlar (C# ve Visual Basic) ve Visual Basic'de Diziler.
İç içe geçmiş döngüleri
İç içe geçirebilirsiniz For Each koyarak bir döngü içinde başka bir döngü.
Aşağıdaki örnek, iç içe geçmiş gösterir For Each...Next yapılar.
' Create lists of numbers and letters
' by using array initializers.
Dim numbers() As Integer = {1, 4, 7}
Dim letters() As String = {"a", "b", "c"}
' Iterate through the list by using nested loops.
For Each number As Integer In numbers
For Each letter As String In letters
Debug.Write(number.ToString & letter & " ")
Next
Next
Debug.WriteLine("")
'Output: 1a 1b 1c 4a 4b 4c 7a 7b 7c
İç içe döngü, her döngü bir benzersiz olmalıdır element değişkeni.
Farklı türde denetim yapıları birbirine içinde iç içe yerleştirebilirsiniz.Daha fazla bilgi için bkz. İç İçe Geçmiş Denetim Yapıları (Visual Basic).
Çıkmak için ve devam etmek için
Çıkmak için deyimi yürütme çıkmak neden olan For...Next döngü ve transferleri denetim için aşağıdaki deyimi Next ifadesi.
Continue For Deyimi aktarır hemen sonraki döngü için.Daha fazla bilgi için bkz. Continue Deyimi (Visual Basic).
Aşağıdaki örnek, nasıl kullanacağınızı gösterir Continue For ve Exit For deyimleri.
Dim numberSeq() As Integer =
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
For Each number As Integer In numberSeq
' If number is between 5 and 7, continue
' with the next iteration.
If number >= 5 And number <= 8 Then
Continue For
End If
' Display the number.
Debug.Write(number.ToString & " ")
' If number is 10, exit the loop.
If number = 10 Then
Exit For
End If
Next
Debug.WriteLine("")
' Output: 1 2 3 4 9 10
Herhangi bir sayıda koyabilirsiniz Exit For deyimlerinde bir For Each döngü.Kullanıldığında içinde iç içe For Each döngüleri, Exit For daha yüksek düzeye iç içe en içteki döngü ve transferleri denetim çıkmak yürütme neden olur.
Exit ForBazı koşulun bir değerlendirmenin ardından sık sık kullanılır, örneğin, bir If...Then...Else yapısı.Kullanmak istediğiniz Exit For için aşağıdaki koşullar:
Yineleme devam etmeden, gereksiz ya da olanaksız.Bu, hatalı bir değer veya bir sonlandırma isteği tarafından kaynaklanabilir.
Bir özel durum yakalandı bir Try...Catch...Finally.Kullanım Exit For sonunda Finally blok.
Büyük veya sonsuz bile birkaç kez çalıştırılan bir döngü sonsuz bir döngüye vardır.Böyle bir durum olduğunu görürseniz, kullanabileceğiniz Exit For döngü atlamak için.Daha fazla bilgi için bkz. Do...Loop Deyimi (Visual Basic).
Yineleyicilerde
Kullandığınız bir Yineleyici özel bir yinelemeye bir koleksiyon gerçekleştirmek için.Bir yineleyici bir işlev olabilir veya bir Get erişimci.Kullandığı bir Yield koleksiyonun her öğesine bir anda geri dönmek için deyim.
Bir yineleyici kullanarak arama bir For Each...Next ifadesi.Her tekrarında For Each döngüsü, yineleyici çağırır.Zaman bir Yield deyimi Yineleyici ifadesinde üst sınırına Yield deyimi döndürülüyor ve kod geçerli konumda korunur.Yürütme Yineleyici adlı bir sonraki açışınızda bu konumdan yeniden başlatılır.
Aşağıdaki örnek bir yineleyici işlevi kullanır.Yineleyici işlevine sahip bir Yield deyimi içinde olan bir için...Sonraki döngü.İçinde ListEvenNumbers yöntemi, her tekrarında For Each ifade gövdesi diğerine geçer Yineleyici işlevine bir çağrı oluşturur Yield ifadesi.
Public Sub ListEvenNumbers()
For Each number As Integer In EvenSequence(5, 18)
Debug.Write(number & " ")
Next
Debug.WriteLine("")
' Output: 6 8 10 12 14 16 18
End Sub
Private Iterator Function EvenSequence(
ByVal firstNumber As Integer, ByVal lastNumber As Integer) _
As System.Collections.Generic.IEnumerable(Of Integer)
' Yield even numbers in the range.
For number = firstNumber To lastNumber
If number Mod 2 = 0 Then
Yield number
End If
Next
End Function
Daha fazla bilgi için, bkz. Yineleyiciler (C# ve Visual Basic), Yield Deyimi (Visual Basic) ve Yineleyici (Visual Basic)
Teknik uygulama
When a For Each…Next deyimi çalıştıran, Visual Basic koleksiyon yalnızca bir kez döngü başlamadan önce değerlendirir.Deyimi taşınız değişirse element veya group, bu değişiklikleri döngü etkilemez.
Ne zaman koleksiyondaki tüm öğeleri sırayla atanan için element, For Each döngü durur ve deyimi aşağıdaki denetim Next ifadesi.
element Taşınmadığından bildirilmiş Bu döngü dışında onu bildirmelidir, For Each ifadesi.Tür bildirebilirsiniz element kullanarak açıkça bir As deyimi veya türü atamak için tür çıkarımı kullanan.Her iki durumda da kapsamını element döngüsünün gövdesi.Ancak, bildiremezsiniz element dışında ve döngü içinde.
İsteğe bağlı olarak belirtebileceğiniz element , Next ifadesi.Özellikle Yuvalanmış VirtualHost ise bu, programınızın okunabilirliğini artırır For Each döngüleri.Görüntülenen ilgili olarak aynı değişkeni belirtmelisiniz For Each ifadesi.
Değeri değiştirmekten kaçının isteyebilirsiniz element döngü içinde.Bunu okuyun ve hata ayıklama kodunuzu daha zor yapabilirsiniz.Değerinin değiştirilmesi group koleksiyonu veya döngünün ilk girilen olduğu belirlenmiştir kendi öğeleri etkilemez.
Ne zaman sizin geçirme döngüleri, bir Next önce bir dış iç içe geçme düzeyi bildirimi varıldığında Next bir iç düzeyi, derleyici bir hata bildirir.Ancak, derleyici bu hata, yalnızca belirlediğiniz üst üste algılayabilir element , her Next ifadesi.
Kodunuzu belirli bir sırada bir koleksiyon geçme üzerinde bağlıdır, bir For Each...Next koleksiyon numaralayıcı nesnesinin özelliklerini bilmiyorsanız sunar, döngünün en iyi seçenek değildir.Çapraz Geçişi sırasını Visual Basic, ancak tarafından belirlenen değil MoveNext sýralayýcý nesne yöntemi.Bu nedenle, hangi koleksiyon içinde döndürülen ilk öğesidir tahmin etmek mümkün olmayabilir element, veya belirli bir öğeyi sonra iade edilmesi için İleri olduğu.Bir başka bir döngü yapısı gibi kullanarak daha güvenilir sonuçlar elde For...Next or Do...Loop.
Veri türü element , öğeleri veri türü olmalıdır group için dönüştürülebilir.
Veri türü group bir koleksiyonu veya bir dizi sýralanabilir başvuran bir başvuru türü olmalıdır.Yani en sık group uygulayan bir nesneye başvurduğunu IEnumerable arabiriminin System.Collections ad alanı veya IEnumerable arabiriminin System.Collections.Generic ad alanı.System.Collections.IEnumerabletanımlar GetEnumerator yöntemi, koleksiyon için bir enumerator nesnesi döndürür.Numaralandırıcı nesne uygular System.Collections.IEnumerator arabiriminin System.Collections ad ve ortaya çıkaran Current özelliği ve Reset ve MoveNext yöntemleri.Visual Basic bu koleksiyon çapraz geçiş yapmak için kullanır.
Daraltıcı dönüşümler
Zaman Option Strict ayarlamak On, daraltıcı dönüşümlere normalde derleyici hatalarına neden olabilir.İçinde bir For Each deyimi, ancak öğeleri türünden group için element değerlendirilir ve çalışma zamanında gerçekleştirilen ve derleyici hataları Daraltıcı dönüşümler neden bastırılır.
Aşağıdaki örnekte, atamasının m başlangıç değeri olarak n ne zaman derleme olmayan Option Strict üzerinde çünkü dönüştürme işlemi bir Long için bir Integer daraltma dönüşümü.İçinde For Each deyimi, ancak hiçbir derleyici hatası olduğunu bildirdi, bile atama için number aynı dönüştürme gerektirir Long için Integer.İçinde For Each büyük bir sayı içeren bir deyim bir çalışma zamanı hatası oluşur, ToInteger en büyük sayıya uygulanır.
Option Strict On
Module Module1
Sub Main()
' The assignment of m to n causes a compiler error when
' Option Strict is on.
Dim m As Long = 987
'Dim n As Integer = m
' The For Each loop requires the same conversion but
' causes no errors, even when Option Strict is on.
For Each number As Integer In New Long() {45, 3, 987}
Console.Write(number & " ")
Next
Console.WriteLine()
' Output: 45 3 987
' Here a run-time error is raised because 9876543210
' is too large for type Integer.
'For Each number As Integer In New Long() {45, 3, 9876543210}
' Console.Write(number & " ")
'Next
Console.ReadKey()
End Sub
End Module
IEnumerator çağrıları
Zaman yürütülmesi bir For Each...Next döngü başlatır, Visual Basic doğrular group geçerli koleksiyon nesnesine başvurur.Aksi takdirde, bir istisna atar.Aksi halde, çağıran MoveNext yöntemi ve Current ilk öğeyi döndürmek için numaralayıcı nesnenin özelliği.MoveNext Koleksiyonu boşsa, hiçbir sonraki öğe başka bir deyişle, gösterir For Each döngü durur ve deyimi aşağıdaki denetim Next ifadesi.Aksi durumda, Visual Basic ayarlar element ilk öğe ve deyim bloğunu çalışır.
Visual Basic karşılaştığı her zaman Next deyimi, döndürdüğü için For Each ifadesi.Yeniden çağırır MoveNext ve Current sonraki öğeye ve yeniden dönmek için blok çalışır ya da sonucuna bağlı olarak döngü durur.Kadar bu işleme devam eder MoveNext hiç bir sonraki öğe olduğunu belirtir veya bir Exit For deyimi ile karşılaştı.
Koleksiyon değiştirme. Numaralandırıcı nesne tarafından döndürülen GetEnumerator normalde ekleme, silme, değiştirme veya herhangi bir öğe Sipariş toplama değiştirmenize izin vermez.Sonra başlatılan koleksiyon değiştirirseniz, bir For Each...Next döngüsü enumerator nesnesi geçersiz hale gelir ve sonraki öğeye erişme denemesi neden olan bir InvalidOperationException özel durum.
Ancak, bu değişikliği engelleme tarafından belirlenen değil Visual Basic, ancak bunun yerine uygulaması tarafından IEnumerable arabirim.Uygulamak mümkündür IEnumerable yineleme sırasında değiştirilmesine izin veren bir şekilde.Böyle dinamik değişiklik yapmak düşünüyorsanız, özelliklerini anladığınızdan emin IEnumerable kullanmakta olduğunuz tahsilat uygulaması.
Koleksiyon öğeleri değiştirme.Current Sýralayýcý nesne özelliği olan ReadOnly (Visual Basic), ve her koleksiyon öğesi, yerel bir kopyasını döndürür.Bu öğeleri değiştiremezsiniz anlamına gelir, bir For Each...Next loop.Yaptığınız değişiklikler yalnızca yerel kopyayı etkiler Current ve alttaki koleksiyonuna gösterilmez.Ancak, bir öğeye başvuru türü ise, onun işaret örnek üyeleri değiştirebilirsiniz.Aşağıdaki örnek BackColor her üye thisControl öğesi.Bununla birlikte, değişiklik yapamazsınız thisControl kendisi.
Sub lightBlueBackground(ByVal thisForm As System.Windows.Forms.Form)
For Each thisControl As System.Windows.Forms.Control In thisForm.Controls
thisControl.BackColor = System.Drawing.Color.LightBlue
Next thisControl
End Sub
Önceki örnekte değiştirebilirsiniz BackColor her üye thisControl öğesinde, üzerinde değişiklik yapamazsınız, ancak thisControl kendisi.
Diziler geçiş yapma. Çünkü Array uygulayan sınıfı IEnumerable arabirimi, tüm dizileri ortaya GetEnumerator yöntem.Bunun anlamı olan bir dizi boyunca yineleme yapabilirsiniz bir For Each...Next loop.Ancak, dizi öğeleri yalnızca okuyabilir.Bunları değiştiremezsiniz.
Örnek
Aşağıdaki örnek kullanarak c:\ dizinindeki tüm klasörleri listeler DirectoryInfo sınıf.
Dim dInfo As New System.IO.DirectoryInfo("c:\")
For Each dir As System.IO.DirectoryInfo In dInfo.GetDirectories()
Debug.WriteLine(dir.Name)
Next
Aşağıdaki örnek bir koleksiyon sıralamak için bir yordam gösterir.Örnek örneklerini sıralar bir Car depolanan sınıf bir List.Car Uygulayan sınıfı IComparable gerektiren arabirimi, CompareTo uygulanan yöntemi.
Her çağrı CompareTo yöntemi sıralamak için kullanılan tek bir karşılaştırma yapar.Kullanıcı yazılmış kod içinde CompareTo yöntemi, geçerli nesnenin başka bir nesneyle her karşılaştırma için bir değer döndürür.Döndürülen değer olan geçerli nesne ise sıfır daha az diğerinden daha az nesne, geçerli nesne başka bir nesne fazlaysa, sıfır ve sıfır büyük eşit ise.Bu, kodun içinde büyüktür, küçüktür ölçütlerini tanımlamak ve eşit olanak sağlar.
İçinde ListCars yöntemi, cars.Sort() ifade listeyi sıralar.Bu çağrıyı Sort yöntemi, List neden olan CompareTo için otomatik olarak çağrılacak yöntemi Car nesnelerini List.
Public Sub ListCars()
' Create some new cars.
Dim cars As New List(Of Car) From
{
New Car With {.Name = "car1", .Color = "blue", .Speed = 20},
New Car With {.Name = "car2", .Color = "red", .Speed = 50},
New Car With {.Name = "car3", .Color = "green", .Speed = 10},
New Car With {.Name = "car4", .Color = "blue", .Speed = 50},
New Car With {.Name = "car5", .Color = "blue", .Speed = 30},
New Car With {.Name = "car6", .Color = "red", .Speed = 60},
New Car With {.Name = "car7", .Color = "green", .Speed = 50}
}
' Sort the cars by color alphabetically, and then by speed
' in descending order.
cars.Sort()
' View all of the cars.
For Each thisCar As Car In cars
Debug.Write(thisCar.Color.PadRight(5) & " ")
Debug.Write(thisCar.Speed.ToString & " ")
Debug.Write(thisCar.Name)
Debug.WriteLine("")
Next
' Output:
' blue 50 car4
' blue 30 car5
' blue 20 car1
' green 50 car7
' green 10 car3
' red 60 car6
' red 50 car2
End Sub
Public Class Car
Implements IComparable(Of Car)
Public Property Name As String
Public Property Speed As Integer
Public Property Color As String
Public Function CompareTo(ByVal other As Car) As Integer _
Implements System.IComparable(Of Car).CompareTo
' A call to this method makes a single comparison that is
' used for sorting.
' Determine the relative order of the objects being compared.
' Sort by color alphabetically, and then by speed in
' descending order.
' Compare the colors.
Dim compare As Integer
compare = String.Compare(Me.Color, other.Color, True)
' If the colors are the same, compare the speeds.
If compare = 0 Then
compare = Me.Speed.CompareTo(other.Speed)
' Use descending order for speed.
compare = -compare
End If
Return compare
End Function
End Class
Ayrıca bkz.
Başvuru
For...Next Deyimi (Visual Basic)
While...End While Deyimi (Visual Basic)
Do...Loop Deyimi (Visual Basic)
Kavramlar
Çevrim Yapıları (Visual Basic)
Genişletme ve Daraltma Dönüşümleri (Visual Basic)
Nesne Başlatıcıları: Adlandırılmış ve Anonim Türler (Visual Basic)
Koleksiyon Başlatıcıları (Visual Basic)