3 Mayıs 2011 Salı

Stringi int dizisine çevirme, C# Extension Method yazarak. Ninja yolu, tek satırlık ve döngüsüz .


fibonaccisnipSık-sık girdide boşlukla ayrılmış sayılar alıyoruz.
Bunu string gibi okuyup integer dizine çevirmemiz gerekiyor.
Adeta bunu her defa for döngüsünde Convert.ToInt32 ya Int32.Parse yazarak gerçekleştiriyoruz.
Şimdi ise bunu tek satırda ve döngü kullanmadan nasıl yapıldığını göreceksiniz.
Hatta, hiç string değişkenine aktarmadan kısa ve güzel böyle bir koda varacağız:

int[] data = Console.ReadLine().ToIntArray()

(ToIntArray() metodu en son C# .Net 4 dahil string dizilerinde mevcut değil. Extension Methodla eklenildi. Kodu en aşağıda.)
Bence harika.

Önce stringin tek satırda integer dizisine nasıl dönüştüğüne bakalım.
Bunun için iki yol var. Her ikisi stringi string dizisine, onu da int dizisine çevirmekden geçiyor. (aralıklı sayılar stringi =>[işlem: string aralıklarda kesiliyor…] her elemanı bir sayı tutan string dizisi =>[işlem: her eleman stringden integere çevriliyor ve yeni dizi oluşturuluyor] istenilen int dizisi).
Stringi diziye bölmek için Split kullanıyoruz. (Split – böl, parçala.) Girdide bizde boşlukla ayrılmış sayılar olduğu için, boşlukla (‘ ‘) bölünüyor. Sonra onlar Array.ConvertAll ya Linq`in Select metodu ile int dizisine çevriliyor.

string s = Console.ReadLine()
int[] data;

data = Array.ConvertAll(s.Split(' '), i => Int32.Parse(i)); // Yol bir

data = s.Split(' ').Select(s => int.Parse(s)).ToArray(); // Yol iki, Linq ister

String.Split, Array.ConvertAll, Linq.Enumerable.Select
(bunların ilk ikisi hakkında gelecekde yazacağım)

Şimdi bu blogda ilk Extension Method yazılmasını göreceğiz.

public static class Utils
{
    public static int[] ToIntArray(this string s)
    {
        return Array.ConvertAll(s.Split(' '), i => Int32.Parse(i));
    }
}
public class Program(){
    static void Main(){
        int[] data = Console.ReadLine().ToIntArray();
    }
}

(evet, this string.  ve evet, ToIntArray parametre almıyor. hem de classın ve metotun static tanımına da bakmayın, statik tavr etmez. amma static tanımlanmalı. bu ve diğer tuhaflıklar hakkında gelecekde.)

1 yorum: