Palindrome in C# (using yield return)

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

Share this post: | | | |
Published Sunday, May 07, 2006 5:49 AM by zeddy

Comments

# re: Palindrome in C# (using yield return)

Sunday, May 07, 2006 11:13 AM by zeddy
Yg doyan maen ginian ya... :)

Btw, seru juga kalau fi case2 model begini juga di kasih Big O-nya. Jd, teman2 terbiasa utk hitung cost... :)

# re: Palindrome in C# (using yield return)

Sunday, May 07, 2006 9:44 PM by zeddy
huehehe,, klo bia, smua basic algorithm & data structure di 1st year kuliah (c/c++ style) di-porting ke C#, ma Big O-nya juga ;p atau klo sempat coba bikin parser buat itung kostnya skalian deh mas (ZedCostCalc),,

# re: Palindrome in C# (using yield return)

Monday, May 08, 2006 7:35 PM by zeddy
Zed, usulkan ke Redmond untuk support LISP dan Prolog di .NET lebih mantap untuk palindrom-palindroman ... atau udah ada ?

Leave a Comment

(required) 
(required) 
(optional)
(required) 

Enter the numbers above:
Powered by Community Server (Commercial Edition), by Telligent Systems