Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ПолноС руководство. Π‘# 4.0Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 185

Автор Π¨ΠΈΠ»Π΄Ρ‚ Π“Π΅Ρ€Π±Π΅Ρ€Ρ‚

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ, устанавливаСмый Π² Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, Π²Ρ‹Π·Π²Π°Π² для этойколлСкции ΠΌΠ΅Ρ‚ΠΎΠ΄ GetEnumerator().

ΠžΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ MoveNext(). ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ Ρ†ΠΈΠΊΠ» Π΄ΠΎΡ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄ MoveNext() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true.

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свойства Current.НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ рСализуСтся данная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°.Π’ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ класс ArrayList, Π½ΠΎ ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ цикличСскогообращСния ΠΊ элСмСнтам ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ пСрСчислитСля ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ для ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ любого Ρ‚ΠΈΠΏΠ°, Π² Ρ‚ΠΎΠΌ числС ΠΈ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Ρ….// ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ пСрСчислитСля.using System;using System.Collections;class EnumeratorDemo {static void Main() {ArrayList list = new ArrayList(1);for (int i=0; i < 10; i++)list.Add(i);// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ для доступа ΠΊ списку.IEnumerator etr = list.GetEnumerator();while(etr.MoveNext())Console.Write(etr.Current + " ");Console.WriteLine();// ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ пСрСчислСниС списка.etr.Reset();while(etr.MoveNext())Console.Write(etr.Current + " ");Console.WriteLine();}}Π’ΠΎΡ‚ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.0 1 2 3 4 5 6 7 8 90 1 2 3 4 5 6 7 8 9Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, для цикличСского обращСния ΠΊ элСмСнтам ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»foreach оказываСтся Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ, Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ прСдоставляСт большС возмоТностСй для управлСния, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΆΠ΅Π»Π°Π½ΠΈΠΈ всСгда ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² исходноС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ пСрСчислитСля Ρ‚ΠΈΠΏΠ° IDictionaryEnumeratorЕсли для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π² Π²ΠΈΠ΄Π΅ словаря, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΈΠΏΠ° Hashtable,рСализуСтся Π½Π΅ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ интСрфСйс IDictionary, Ρ‚ΠΎ для цикличСского обращСния ΠΊ элСмСнтам Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ Ρ‚ΠΈΠΏΠ°IDictionaryEnumerator вмСсто пСрСчислитСля Ρ‚ΠΈΠΏΠ° IEnumerator. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡIDictionaryEnumerator наслСдуСт ΠΎΡ‚ интСрфСйса IEnumerator ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρ€ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… свойства. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈΠ· Π½ΠΈΡ… являСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ свойство.DictionaryEntry Entry { get; }Бвойство Entry позволяСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Ρƒ "ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅" ΠΈΠ· пСрСчислитСля Π²Ρ„ΠΎΡ€ΠΌΠ΅ структуры DictionaryEntry. Напомним, Ρ‡Ρ‚ΠΎ Π² структурС DictionaryEntryΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π΄Π²Π° свойства, Key ΠΈ Value, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступк ΠΊΠ»ΡŽΡ‡Ρƒ ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, связанному с элСмСнтом ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π΄Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… свойства, опрСдСляСмых Π² интСрфСйсС IDictionaryEnumerator.object Key { get; }object Value { get; }Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этих свойств осущСствляСтся нСпосрСдствСнный доступ ΠΊ ΠΊΠ»ΡŽΡ‡Ρƒ ΠΈΠ»ΠΈΠ·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ.ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ Ρ‚ΠΈΠΏΠ° IDictionaryEnumerator ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŽ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС получаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свойств Entry, Key ΠΈΠ»ΠΈ Value, Π° Π½Π΅ свойства Current. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ,приобрСтя ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ Ρ‚ΠΈΠΏΠ° IDictionaryEnumerator, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄MoveNext(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ. А для получСния ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ…Π΅Π΅ элСмСнтов слСдуСт ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° MoveNext(). Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ возвращаСтлогичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false, ΠΊΠΎΠ³Π΄Π° Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ большС Π½Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта.Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ элСмСнты ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ° HashtableΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ пСрСчислитСля Ρ‚ΠΈΠΏΠ° IDictionaryEnumerator.// ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ пСрСчислитСля Ρ‚ΠΈΠΏΠ° IDictionaryEnumerator.using System;using System.Collections;class IDicEnumDemo {static void Main() {// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ.Hashtable ht = new Hashtable();// Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ элСмСнты Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ.ht.Add("КСн", "555-7756");ht.Add("ΠœΡΡ€ΠΈ", "555-9876");ht.Add("Π’ΠΎΠΌ", "555-3456");ht.Add("Π’ΠΎΠ΄Π΄", "555-3452");// ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ пСрСчислитСля.IDictionaryEnumerator etr = ht.GetEnumerator();Console.WriteLine("ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свойства Entry.");while(etr.MoveNext())Console.WriteLine(etr.Entry.Key + ": " + etr.Entry.Value);Console.WriteLine ();Console.WriteLine("ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ " +"с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свойств Key ΠΈ Value.");etr.Reset();while(etr.MoveNext())Console.WriteLine(etr.Key + ": " + etr.Value);}}НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свойства Entry.ΠœΡΡ€ΠΈ: 555-9876Π’ΠΎΠΌ: 555-3456Π’ΠΎΠ΄Π΄: 555-3452КСн: 555-7756ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свойств Key ΠΈ Value.ΠœΡΡ€ΠΈ: 555-9876Π’ΠΎΠΌ: 555-3456Π’ΠΎΠ΄Π΄: 555-3452КСн: 555-7756РСализация интСрфСйсов IEnumerable ΠΈ IEnumeratorКак ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, для цикличСского обращСния ΠΊ элСмСнтам ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΏΡ€ΠΎΡ‰Π΅ (Π΄Π° ΠΈ Π»ΡƒΡ‡ΡˆΠ΅) ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ» foreach, Ρ‡Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ нСпосрСдствСнно ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ интСрфСйса IEnumerator. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ясноС прСдставлСниС ΠΎΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ дСйствия ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… интСрфСйсов Π²Π°ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅: СслитрСбуСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ класс, содСрТащий ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, пСрСчисляСмыС Π² Ρ†ΠΈΠΊΠ»Π΅ foreach, Ρ‚ΠΎ вэтом классС слСдуСт Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйсы IEnumerator ΠΈ IEnumerable. Π˜Π½Ρ‹ΠΌΠΈΡΠ»ΠΎΠ²Π°ΠΌΠΈ, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ опрСдСляСмого ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ класса Π²Ρ†ΠΈΠΊΠ»Π΅ foreach, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйсы IEnumerator ΠΈ IEnumerableΠ² ΠΈΡ… ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅. ΠŸΡ€Π°Π²Π΄Π°, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Π° интСрфСйса Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π²Π΅Π»ΠΈΠΊΠΈ.Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ интСрфСйсы IEnumerator ΠΈIEnumerable Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Π² Π½Π΅ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅, с Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ содСрТимоС массива, инкапсулированного Π² классС MyClass.// Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйсы IEnumerable ΠΈ IEnumerator.using System;using System.Collections;class MyClass : IEnumerator, IEnumerable {char[] chrs = { 'А', 'Π’', 'C', 'D' };int idx = -1;// Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс IEnumerable.public IEnumerator GetEnumerator() {return this;}// Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… рСализуСтся интСрфСйс IEnumerator// Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.public object Current {get {return chrs[idx];}}// ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ.public bool MoveNext() {if(idx == chrs.Length-1) {Reset(); // ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ Π² ΠΊΠΎΠ½Π΅Ρ†return false;}idx++;return true;}// Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ Π² Π½Π°Ρ‡Π°Π»ΠΎ.public void Reset() { idx = -1; }}class EnumeratorImplDemo {static void Main() {MyClass me = new MyClass();// ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ содСрТимоС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° me.foreach(char ch in me)Console.Write(ch + " ");Console.WriteLine();// Π’Π½ΠΎΠ²ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ содСрТимоС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° me.foreach(char ch in me)Console.Write(ch + " ");Console.WriteLine();}}Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.А Π’ Π‘ DА Π’ Π‘ DΠ’ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ сначала создаСтся класс MyClass, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡΠ½Π΅Π±ΠΎΠ»ΡŒΡˆΠΎΠΉ массив Ρ‚ΠΈΠΏΠ° char, состоящий ΠΈΠ· символов А-D. ИндСкс этого массива хранится Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ idx, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ -1. Π—Π°Ρ‚Π΅ΠΌ Π² классС MyClass Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΠ±Π° интСрфСйса, IEnumerator ΠΈ IEnumerable. ΠœΠ΅Ρ‚ΠΎΠ΄ GetEnumerator()Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ссылку Π½Π° ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС оказываСтся Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Бвойство Current Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ символ Π² массивС, Ρ‚.Π΅. ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠΎ индСксу idx. ΠœΠ΅Ρ‚ΠΎΠ΄ MoveNext() ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ индСкс idx Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false, Ссли достигнут ΠΊΠΎΠ½Π΅Ρ†ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС β€” логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true. Напомним, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ оказываСтся Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° MoveNext().Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠ΅Ρ‚ΠΎΠ΄ MoveNext() автоматичСски вызываСтся Π² Ρ†ΠΈΠΊΠ»Π΅ foreach ΠΏΠ΅Ρ€Π΅Π΄ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ ΠΊ свойству Current. ИмСнно поэтому ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ idx устанавливаСтся Ρ€Π°Π²Π½Ρ‹ΠΌ -1. Оно становится Ρ€Π°Π²Π½Ρ‹ΠΌ Π½ΡƒΠ»ΡŽ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΡˆΠ°Π³Π΅Ρ†ΠΈΠΊΠ»Π° foreach. ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Π°Ρ рСализация рассматриваСмых здСсь интСрфСйсов Π±ΡƒΠ΄Π΅Ρ‚Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ самому ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ.Π”Π°Π»Π΅Π΅ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Main() создаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ mc Ρ‚ΠΈΠΏΠ° MyClass, ΠΈ содСрТимоС ΡΡ‚ΠΎΠ³ΠΎΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄Π²Π°ΠΆΠ΄Ρ‹ отобраТаСтся Π² Ρ†ΠΈΠΊΠ»Π΅ foreach.ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²ΠšΠ°ΠΊ слСдуСт ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйсы IEnumerator ΠΈIEnumerable Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ. Но Π΅Ρ‰Π΅ ΠΏΡ€ΠΎΡ‰Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΠ»ΠΈ аксСссор, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Ρ‡Π»Π΅Π½Ρ‹ совокупности ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΡ‚ Π΅Π΅ Π½Π°Ρ‡Π°Π»Π° ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°. Π’Π°ΠΊ, Ссли Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ массив состоит изпяти элСмСнтов, Ρ‚ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π΄Π°Π½Π½ΠΎΠ³ΠΎ массива Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ всС эти элСмСнты ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π² ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ опрСдСляСмого ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌΠΊΠ»Π°ΡΡΠ° Π² Ρ†ΠΈΠΊΠ»Π΅ foreach.ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌΡΡ сначала ΠΊ простому ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π½ΠΈΠΆΠ΅ программаявляСтся ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠΉ вСрсиСй ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ вмСсто явной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйсов IEnumerator ΠΈ IEnumerable примСняСтся ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€.// ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ примСнСния ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.using System;using System.Collections;class MyClass {char[] chrs = { 'A', 'B', 'C', 'D' };// Π­Ρ‚ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ символы ΠΈΠ· массива chrs.public IEnumerator GetEnumerator() {foreach(char ch in chrs)yield return ch;}}class ItrDemo {static void Main() {MyClass me = new MyClass();foreach(char ch in me)Console.Write(ch + " ");Console.WriteLine();}}ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ получаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.А Π’ Π‘ DКак Π²ΠΈΠ΄ΠΈΡ‚Π΅, содСрТимоС массива mc.chrs пСрСчислСно.Рассмотрим эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ,Ρ‡Ρ‚ΠΎ Π² классС MyClass Π½Π΅ указываСтся IEnumerator Π² качСствС Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ интСрфСйса. ΠŸΡ€ΠΈ создании ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° компилятор Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ этот интСрфСйс автоматичСски.И Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ GetEnumerator(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ радиудобства приводится Π½ΠΈΠΆΠ΅ Π΅Ρ‰Π΅ Ρ€Π°Π·.// Π­Ρ‚ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ символы ΠΈΠ· массива chrs.public IEnumerator GetEnumerator() {foreach(char ch in chrs)yield return ch;}Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса MyClass. Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π² Π½Π΅ΠΌ явно рСализуСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ GetEnumerator(), ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² интСрфСйсС IEnumerable. А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ нСпосрСдствСнно ΠΊ Ρ‚Π΅Π»Ρƒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Оно состоит ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° foreach,Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ элСмСнты ΠΈΠ· массива chrs. И дСлаСтся это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° yield return. Π­Ρ‚ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ,ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС оказываСтся ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ символ Π² массивС chrs. Благодаряэтому срСдству ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ mc Ρ‚ΠΈΠΏΠ° MyClass организуСтся Π² Ρ†ΠΈΠΊΠ»Π΅ foreachΠ²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Main().ΠžΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ yield слуТит Π² языкС C# Π² качСствС контСкстного ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова. Π­Ρ‚ΠΎΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π±Π»ΠΎΠΊΠ΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. А Π²Π½Π΅ этогоблока ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использовано Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π»ΡŽΠ±ΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ.Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ особо ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΏΠΈΡ€Π°Ρ‚ΡŒΡΡ Π½Π° массив ΠΈΠ»ΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Он Π΄ΠΎΠ»ΠΆΠ΅Π½ просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнтиз совокупности элСмСнтов. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ элСмСнты ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ построСны динамичСски с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° вСрсия ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ всС Π±ΡƒΠΊΠ²Ρ‹ английскогоалфавита, Π½Π°Π±Ρ€Π°Π½Π½Ρ‹Π΅ Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС. ВмСсто массива Π±ΡƒΠΊΠ²Ρ‹ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² Ρ†ΠΈΠΊΠ»Π΅for.// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ динамичСского построСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ,// Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.using System;using System.Collections;class MyClass {char ch = 'A';// Π­Ρ‚ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±ΡƒΠΊΠ²Ρ‹ английского// Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°, Π½Π°Π±Ρ€Π°Π½Π½Ρ‹Π΅ Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС.public IEnumerator GetEnumerator() {for(int i=0; i < 26; i++)yield return (char) (ch + i);}}class ItrDemo2 {static void Main() {MyClass me = new MyClass();foreach(char ch in me)Console.Write(ch + " ");Console.WriteLine();}}Π’ΠΎΡ‚ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.A B C D E F G H I J K L M N O P Q R S T U V W X Y ZΠŸΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ итСратораДля ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ прСрывания ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° слуТит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Ρ„ΠΎΡ€ΠΌΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° yield.yield break;Когда этот ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ выполняСтся, ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ увСдомляСт ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ достигнут ΠΊΠΎΠ½Π΅Ρ†ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ. А это, ΠΏΠΎ сущСству, останавливаСт сам ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€.ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° являСтся вСрсиСй ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠΉ с Ρ†Π΅Π»ΡŒΡŽ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π΅ΡΡΡ‚ΡŒ Π±ΡƒΠΊΠ² английского Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°.// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ прСрывания ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.using System;using System.Collections;class MyClass {char ch = 'A';// Π­Ρ‚ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 10 Π±ΡƒΠΊΠ² английского Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°.public IEnumerator GetEnumerator() {for(int i=0; i < 26; i++) {if(i == 10) yield break; // ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎyield return (char) (ch + i);}}}class ItrDemo3 {static void Main() {MyClass mc = new MyClass();foreach(char ch in mc)Console.Write(ch + " ");Console.WriteLine();}}Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.A B C D E F G H I JΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² yieldΠ’ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ допускаСтся ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² yield. Но ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉΡ‚Π°ΠΊΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ примСнСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² yield.using System;using System.Collections;class MyClass {// Π­Ρ‚ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±ΡƒΠΊΠ²Ρ‹ А, Π’, Π‘, D ΠΈ Π•.public IEnumerator GetEnumerator() {yield return 'A';yield return 'B';yield return 'C';yield return 'D';yield return 'E';}}class ItrDemo5 {static void Main() {MyClass me = new MyClass ();foreach(char ch in mc)Console.Write(ch + " ");Console.WriteLine();}}НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° выполнСния этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.А Π’ Π‘ D Π•Π’ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° GetEnumerator() Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² yield. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ особо ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉΡ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΈΠ· ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ получаСтся ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ элСмСнт. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π° каТдомшагС Ρ†ΠΈΠΊΠ»Π° foreach Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Main() возвращаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ символ.Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π±Ρ‹Π» продСмонстрирован ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ способ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Но Π΅ΠΌΡƒ имССтся Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° Π² Π²ΠΈΠ΄Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС создаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΠ»ΠΈ аксСссор, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ ссылку Π½Π°ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° IEnumerable. ИмСнно этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΊΠΎΠ΄Π΅ для прСдоставлСния ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ прСдставляСт собой ΠΌΠ΅Ρ‚ΠΎΠ΄, общая Ρ„ΠΎΡ€ΠΌΠ° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π½ΠΈΠΆΠ΅:public IEnumerable имяитСратора(списокпарамСтров) {// ...yield return obj;}Π³Π΄Π΅ имяитСратора ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ имя ΠΌΠ΅Ρ‚ΠΎΠ΄Π°; списокпарамСтров β€” отнуля Π΄ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°; obj β€” ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ создан,Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ ΠΎΠ½ трСбуСтся, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для управлСния Ρ†ΠΈΠΊΠ»ΠΎΠΌforeach.Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ вСсьма ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях,ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌΡƒ процСссом получСния ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… элСмСнтов ΠΈΠ· ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ. НапримСр, ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ ΠΌΠΎΠΆΠ½ΠΎΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ совокупности элСмСнтов, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… ΠΈΠ·ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ. Π­Ρ‚Ρƒ Ρ„ΠΎΡ€ΠΌΡƒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ, Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠ² Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π΄Π²Π° способа примСнСния ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° для получСния элСмСнтов ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ. Π’ ΠΎΠ΄Π½ΠΎΠΌ случаС элСмСнты ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Π² Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ…, Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ β€” элСмСнты ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ с Π½Π°Ρ‡Π°Π»Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Π΄ΠΎΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€Π΅Π΄Π΅Π»Π°.// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹.using System;using System.Collections;class MyClass {char ch = 'A';// Π­Ρ‚ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±ΡƒΠΊΠ²Ρ‹ английского Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°,// начиная с Π±ΡƒΠΊΠ²Ρ‹ А ΠΈ кончая ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ ΠΏΡ€Π΅Π΄Π΅Π»ΠΎΠΌ.public IEnumerable MyItr(int end) {for(int i=0; i < end; i++)yield return (char) (ch + i);}// Π­Ρ‚ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±ΡƒΠΊΠ²Ρ‹ Π² Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ….public IEnumerable MyItr(int begin, int end) {for(int i=begin; i < end; i++)yield return (char) (ch + i);}}class ItrDemo4 {static void Main() {MyClass mc = new MyClass();Console.WriteLine("Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 7 Π±ΡƒΠΊΠ²:");foreach(char ch in mc.MyItr(7))Console.Write(ch + " ");Console.WriteLine("\n");Console.WriteLine("Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π±ΡƒΠΊΠ²Ρ‹ ΠΎΡ‚ F Π΄ΠΎ L:");foreach(char ch in mc.MyItr(5, 12))Console.Write(ch + " ");Console.WriteLine();}}Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 7 Π±ΡƒΠΊΠ²:А Π’ Π‘ D Π• F GΠ’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π±ΡƒΠΊΠ²Ρ‹ ΠΎΡ‚ F Π΄ΠΎ L:F G Н I J К LΠ‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»ΠΈΡΡŒ Π½Π΅ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Π΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Π½ΠΎ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Π΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹. Для этого достаточно Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° IEnumerator ΠΈΠ»ΠΈ IEnumerable. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΏΡ€ΠΈΠΌΠ΅Ρ€ создания ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.// ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.using System;using System.Collections.Generic;class MyClass {T[] array;public MyClass(T[] a) {array = a;}// Π­Ρ‚ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ символы ΠΈΠ· массива chrs.public IEnumerator GetEnumerator() {foreach(T obj in array)yield return obj;}}class GenericItrDemo {static void Main() {int[] nums = { 4, 3, 6, 4, 7, 9 };MyClass me = new MyClass(nums);foreach(int x in mc)Console.Write(x + " ");Console.WriteLine();bool[] bVals = { true, true, false, true };MyClass mc2 = new MyClass(bVals);foreach(bool b in mc2)Console.Write(b + " ");Console.WriteLine();}}Π’ΠΎΡ‚ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.4 3 6 4 7 9True True False TrueΠ’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ массив, состоящий ΠΈΠ· Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², пСрСдаСтся конструктору класса MyClass. Π’ΠΈΠΏ этого массива ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ‚ΠΈΠΏΠ° Π² конструкторС класса MyClass.ΠœΠ΅Ρ‚ΠΎΠ΄ GetEnumerator() ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Ρ‚ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ Ρ‚ΠΈΠΏΠ° IEnumerator. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ вклассС MyClass, способСн ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ любого Ρ‚ΠΈΠΏΠ°.Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉΠ’ C# имССтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ срСдство, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΈ ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰Π΅Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ. ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ явно Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Add(), ΠΏΡ€ΠΈ создании ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ список ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ². ΠŸΠΎΡΠ»Π΅ΡΡ‚ΠΎΠ³ΠΎ компилятор ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅Ρ‚ автоматичСскиС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Add(), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ значСния ΠΈΠ· этого списка. Бинтаксис Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ отличаСтся ΠΎΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ массива. ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌΡΡ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ создаСтся коллСкция Ρ‚ΠΈΠΏΠ°List, инициализируСмая символами Π‘, А, Π•, Π’, D ΠΈ F.List lst = new List() { 'Π‘', 'А', 'Π•', 'Π’', 'D', 'F' };ПослС выполнСния этого ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства lst.Count Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ 6,ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ²ΠΎ число ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ². А послС выполнСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎΡ†ΠΈΠΊΠ»Π° foreach:foreach(ch in lst)Console.Write(ch + " ");получится Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:Π‘ A E Π’ D FДля ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ° LinkedList, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранятся ΠΏΠ°Ρ€Ρ‹ "ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅", ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ приходится ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠΈ, ΠΊΠ°ΠΊΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.SortedList lst =new SortedList() { {1, "ΠΎΠ΄ΠΈΠ½"}, {2, "Π΄Π²Π°" }, {3, "Ρ‚Ρ€ΠΈ"} };ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ пСрСдаст ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ΡƒAdd(). Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, пСрвая ΠΏΠ°Ρ€Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² прСобразуСтся компиляторомв Π²Ρ‹Π·ΠΎΠ² Add(1, "ΠΎΠ΄ΠΈΠ½").ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Add() автоматичСски для Π²Π²ΠΎΠ΄Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² Π²ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ, ΠΈ поэтому ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² коллСкциях, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Add(). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² коллСкциях Ρ‚ΠΈΠΏΠ° Stack, Stack,Queue ΠΈΠ»ΠΈ Queue, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π½ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ Add() Π½Π΅ поддСрТиваСтся. Π˜Ρ… Π½Π΅Π»ΡŒΠ·ΡΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Π² Ρ‚Π΅Ρ… коллСкциях Ρ‚ΠΈΠΏΠ° LinkedList, Π³Π΄Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Add() прСдоставляСтся ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ явной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ интСрфСйса.