ΠΠ±Π·ΠΎΡ Π²ΠΎΠΏΡΠΎΡΠΎΠ² ΠΏΠΎ ΡΠ·ΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΠΈΡΠΎΠ²Π°Π½ΠΈΡ C# ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ NET
for
ΠΈ foreach
β¬ ΠΠ΅ΡΠ½ΡΡΡΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ
for
for (int i = 0; i < collection.Length; i++)
{
Console.WriteLine(collection[i]);
}
Π‘ΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΡΡΡΡ ΡΠ°ΡΡΠ΅ΠΉ:
int i = 0;
i < collection.Length;
β ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ.i++
β Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ.array
, List<T>
).for
ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅Ρ ΠΈΠ½Π΄Π΅ΠΊΡ Π½Π°ΠΏΡΡΠΌΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π±ΠΈΡΠ°ΡΡ ΡΠ°ΡΡΠΈΡΠ½ΠΎ, Ρ ΡΠ°Π³ΠΎΠΌ >1, Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, ΠΈ ΡΠ΄Π°Π»ΡΡΡ/Π²ΡΡΠ°Π²Π»ΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ.foreach
foreach (var item in collection)
{
Console.WriteLine(item);
}
GetEnumerator()
) ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ.InvalidOperationException
).for
(ΠΌΠ°ΡΡΠΈΠ²Ρ ΠΈ List<T>
)List<T>
: ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ list[i]
β O(1) (Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ°ΡΡΠΈΠ² ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ).i += 2
, i--
) β ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π² ΡΡΠΊΠ°Ρ
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ°.foreach
(IEnumerable/IEnumerator)GetEnumerator()
+ MoveNext()
+ Current
:var enumerator = collection.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
var item = enumerator.Current;
Console.WriteLine(item);
}
}
finally
{
enumerator.Dispose();
}
ΠΡΠ»ΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ β ΡΡΡΡΠΊΡΡΡΠ° (struct), Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ List<T>.Enumerator
:
foreach
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ struct, ΠΎΠ±ΡΡΠ½ΠΎ Π±Π΅Π· Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΠΉ.IEnumerable<T>
β Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π±ΠΎΠΊΡΠΈΠ½Π³ ΡΡΡΡΠΊΡΡΡΡ β Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΡ Π² ΠΊΡΡΠ΅.ΠΡΠ»ΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ foreach
β InvalidOperationException
(fail-fast).
for
ΠΈ foreach
Π₯Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° | for |
foreach |
---|---|---|
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΈΠ½Π΄Π΅ΠΊΡΠ° | ΠΠ° | ΠΠ΅Ρ (ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π· Current ) |
ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ | ΠΠΎΠΆΠ½ΠΎ (ΠΏΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠ΅) | ΠΠ΅Π»ΡΠ·Ρ (InvalidOperationException) |
ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ | ΠΡΡΡΡΠΎ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΄Π»Ρ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² | ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ ΠΏΡΠΈ IEnumerable, Π½ΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ΠΎ Π΄Π»Ρ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² ΠΈ List |
Π§ΠΈΡΠ°Π΅ΠΌΠΎΡΡΡ ΠΊΠΎΠ΄Π° | ΠΠ΅Π½Π΅Π΅ ΡΠΈΡΠ°Π΅ΠΌΡΠΉ ΠΏΡΠΈ ΡΠ»ΠΎΠΆΠ½ΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡΡ | ΠΠΎΠ»Π΅Π΅ ΡΠΈΡΠ°Π΅ΠΌΡΠΉ, ΠΌΠ΅Π½ΡΡΠ΅ ΠΎΡΠΈΠ±ΠΎΠΊ |
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ/ΡΠ°Π³ | ΠΠ° (i+=2 ) |
ΠΠ΅Ρ (Π½ΡΠΆΠ΅Π½ LINQ ΠΈΠ»ΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ Π»ΠΎΠ³ΠΈΠΊΠ°) |
ΠΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ | ΠΠ° (Π²ΠΏΠ΅ΡΠ΅Π΄, Π½Π°Π·Π°Π΄) | ΠΠ΅Ρ, Π²ΡΠ΅Π³Π΄Π° ΠΏΠΎ ΠΏΠΎΡΡΠ΄ΠΊΡ |
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ enumerator | ΠΠ΅Ρ | ΠΠ° (GetEnumerator ) |
ΠΠ»Π»ΠΎΠΊΠ°ΡΠΈΠΈ | ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ | ΠΠΎΠ·ΠΌΠΎΠΆΠ½Ρ (Π΄Π»Ρ struct enumerator ΠΏΡΠΈ boxing) |
T[]
)for
ΠΈ foreach
ΠΏΠΎΡΡΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½Ρ ΠΏΠΎ ΡΠΊΠΎΡΠΎΡΡΠΈ.foreach
ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΠ΅Ρ Π² ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΈΠΊΠ» Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌ.List<T>
for
β ΠΏΡΡΠΌΠΎΠΉ Π΄ΠΎΡΡΡΠΏ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ.foreach
β ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ List<T>.Enumerator
(struct) β ΠΎΠ±ΡΡΠ½ΠΎ Π±Π΅Π· Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΠΉ.IEnumerable<T>
Π²ΠΌΠ΅ΡΡΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ List<T>
β Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΠΈ.LinkedList<T>
for
Π½Π΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ Π½Π°ΠΏΡΡΠΌΡΡ (Π½Π΅Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠ°).foreach
β Π²ΡΠ΅Π³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ LinkedList<T>.Enumerator
.LinkedList<T>
foreach
ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½Π΅Π΅, ΡΠ΅ΠΌ ΠΏΡΡΠ°ΡΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ for
ΡΠ΅ΡΠ΅Π· ΡΠ·Π»Ρ Π²ΡΡΡΠ½ΡΡ.ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ
for
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΄Π°Π»ΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΏΡΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ΅.foreach
β Π²ΡΠ±ΡΠΎΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, Π΅ΡΠ»ΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ.Boxing enumeratorβΠΎΠ²
foreach
, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π±ΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½Π°, Π΅ΡΠ»ΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ IEnumerable
/IEnumerable<T>
.Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²
// ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Ρ for
for (int i = list.Count - 1; i >= 0; i--)
{
if (ShouldRemove(list[i])) list.RemoveAt(i);
}
// foreach Π²ΡΠ±ΡΠΎΡΠΈΡ InvalidOperationException
for (int i = 0; i < 10; i+=2) { ... } // ΡΠ΅ΡΠ΅Π· ΠΎΠ΄ΠΈΠ½
// foreach Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ°ΠΊΠΎΠΉ ΡΠ°Π³ Π½Π°ΠΏΡΡΠΌΡΡ
List<T>
: for
ΠΈΠ½ΠΎΠ³Π΄Π° ΡΡΡΡ Π±ΡΡΡΡΠ΅Π΅ (Π½Π΅ ΡΠΎΠ·Π΄Π°ΡΡΡΡ enumerator).foreach
ΡΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π΅Π΅.for
foreach
LinkedList<T>
, Dictionary<TKey,TValue>
).Π§Π΅ΠΌ for
ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ foreach
?
for
β ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌ Π½Π°ΠΏΡΡΠΌΡΡ, foreach
β ΡΠ΅ΡΠ΅Π· enumerator.
ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΠ΄Π°Π»ΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² foreach
?
ΠΠ΅Ρ, Π²ΡΠ±ΡΠΎΡ InvalidOperationException
.
ΠΠΎΡΠ΅ΠΌΡ foreach
ΠΈΠ½ΠΎΠ³Π΄Π° Π°Π»Π»ΠΎΡΠΈΡΡΠ΅Ρ ΠΏΠ°ΠΌΡΡΡ?
ΠΡΠ»ΠΈ enumerator β struct, Π½ΠΎ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΊ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ IEnumerable
.
Π§ΡΠΎ Π±ΡΡΡΡΠ΅Π΅ β for
ΠΈΠ»ΠΈ foreach
Π΄Π»Ρ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ²?
ΠΠ±ΡΡΠ½ΠΎ ΠΏΠΎΡΡΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ, ΠΈΠ½ΠΎΠ³Π΄Π° for
ΡΡΡΡ Π±ΡΡΡΡΠ΅Π΅ (Π½Π΅Ρ enumeratorβΠ°).
ΠΠ°ΠΊ ΠΏΠ΅ΡΠ΅Π±ΡΠ°ΡΡ List<T>
Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ?
for (int i = list.Count - 1; i >= 0; i--) { ... }
β¬ ΠΠ΅ΡΠ½ΡΡΡΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ
β¨Dvurechenskyβ¨