Andaikan s adalah sebuah string, maka:
foreach(char c in s)
...
Akan mendapatkan sebuah Iterator yang bergerak dari s[0] sampai s[s.Length – 1], dan meyimpan posisi karakter dalam variabel c.
Untuk mengecek sebuah palindrome, pertama kita butuh sebuah Iterator yang bergerak dari s[s.Length – 1] lantas bergerak mundur ke s[0]. Berikut kode untuk iterator tersebut:
public static System.Collections.IEnumerable ReverseStr(string s)
{
// invariant:
// telah dibaca (s.Length - i) chars dari belakang
for (int i = s.Length - 1;
i >= 0;
--i) {
yield return s[i];
}
}
Anda dapat menggunakannya sebagai berikut:
foreach(char c in ReverseStr(s))
...
Terakhir, untuk mengecek palindrome, kita akan membandingkan karakter s[0] dengan s[s.Length – 1], karakter s[1] dengan s[s.Length – 2], dst…
public static bool IsPalindrome(string s)
{
CharEnumerator iter = s.GetEnumerator();
iter.MoveNext(); // move to first elem
foreach (char c in ReverseStr(s)) {
if (c != iter.Current)
return false;
iter.MoveNext();
}
return true;
}
Dan sekarang untuk mengecek kode kita:
static void Main(string[] args)
{
List<string> words = new List<string>();
words.Add("eye");
words.Add("holiday");
words.Add("civic");
foreach (string s in words) {
Console.WriteLine("{0} is {1}",
s,
IsPalindrome(s) ? "palindrome" : "NOT palindrome");
}
Console.ReadLine();
}
yield return is so useful, dan jika saya menggabungkannya dengan Generic, saya dapat melihat semua elemen ganjil dari sebuah container berisi apa saja dengan kode berikut:
public static System.Collections.Generic.IEnumerable<T>
ElemenGanjil<T>(ICollection<T> container)
{
IEnumerator<T> iter = container.GetEnumerator();
int i = 1;
while (iter.MoveNext()) {
if (i % 2 != 0)
yield return iter.Current;
++i;
}
}
Dan contoh penggunaannya (dengan menggunakan words sebagai List<string> dari contoh palindrome diatas):
Console.WriteLine("Element Ganjil dari words:");
foreach (string s in ElemenGanjil<string>(words))
Console.WriteLine(s);
int[] numbers = new int[] { 1, 2, 3, 4, 5, 6 };
Console.WriteLine("Element Ganjil dari numbers:");
foreach (int i in ElemenGanjil<int>(numbers))
Console.WriteLine(i);
Semoga penggunaan yield return sekarang menjadi jelas bagi Anda J