C#‘de Sayfa Numarası Dizelerinin Ayrıştırılması: Kapsamlı Bir Kılavuz

Yazılım uygulamaları ile çalışırken, özellikle de yazdırma veya sayfalı içerik içeren uygulamalarla ilgilenirken, kullanıcı girdilerinden sayfa numaralarını ayırmanız gerekebilir. Yaygın bir girdi formatı, “1,3,5-10,12” gibi virgül ve tire ile ayrılmış sayfa numaralarının karışımı olabilir. Bu dizeyi bireysel sayfa numaraları listesine dönüştürmeye çalışmak, birçok geliştiricinin otomatik olarak yönetmeyi tercih ettiği bir zorluktur; bu nedenle sıfırdan özel bir çözüm oluşturmak isteyebilirler.

Problem: Sayfa Numarası Dizelerinin Ayrıştırılması

Şöyle düşünebilirsiniz: C#‘in sayfa numarası dizelerini ayrıştırmak için yerleşik bir desteği var mı? C#‘in bu özel görev için özel bir yerleşik işlevi olmamakla birlikte, verimli bir çözüm oluşturmak için araçlar sağladığını söyleyebiliriz. Genel hedef, bir sayfa numarası dizisini alıp, tire ile belirtilen her aralığı genişleterek o bireysel numaraların tam bir listesini çıkarmaktır (örneğin, “5-10” ifadesi “5,6,7,8,9,10” olarak genişletilmelidir).

Çözüm: Özel Bir Ayrıştırıcı Uygulamak

Adım Adım Analiz

Hedefimize ulaşmak için, bir dize manipülasyonu ve C# koleksiyonlarının bir kombinasyonunu kullanabiliriz. Aşağıdaki taslak süreci açıklamaktadır:

  1. Dize Ayırma: Girdi dizesini her virgülden ayırarak bireysel bileşenlere bölerek başlayın. Her bileşen ya tek bir sayı ya da bir sayı aralığı olabilir.
  2. Sayı Ayrıştırma: Segmentin tek bir tam sayı olup olmadığını belirlemek için int.TryParse() kullanın.
  3. Aralık Yönetimi: Eğer bir segment bir tire içeriyorsa (örneğin, “5-10”), segmenti daha da ayırarak başlangıç ve bitiş sayılarını çıkarın. Başlangıcın bitişten küçük veya ona eşit olduğunu doğrulayın.
  4. Aralığı Oluşturma: Belirtilen aralık içindeki tüm tam sayı değerlerini oluşturmak için Enumerable.Range() yöntemini kullanın.
  5. Sonuçları Verme: Son olarak, tüm ayrıştırılmış sayıları geri çağırana iletin.

Örnek Kod

Aşağıda yukarıdaki mantığı C#‘de kapsayan bir örnek uygulama bulunmaktadır:

foreach (string s in "1,3,5-10,12".Split(',')) 
{
    // Bireysel sayfa numaralarını ayrıştırmayı dene
    int num;
    if (int.TryParse(s, out num)) 
    {
        yield return num; // Tek sayıyı geri ver
        continue; // Bir sonraki yinelemeye atla
    }

    // Aksi halde aralığı yönet
    string[] subs = s.Split('-');
    int start, end;

    // Aralık için başlangıç ve bitişi ayrıştır
    if (subs.Length > 1 &&
        int.TryParse(subs[0], out start) &&
        int.TryParse(subs[1], out end) && 
        end >= start) 
    {
        // Başlangıç ve bitiş arasında sayı aralığı oluştur
        int rangeLength = end - start + 1;
        foreach (int i in Enumerable.Range(start, rangeLength)) 
        {
            yield return i; // Aralıktaki her sayıyı geri ver
        }
    }
}

Kodun Açıklaması

  • Girdiyi Ayırma: Girdi dizesini yönetilebilir parçalara ayırmak için .Split(',') yöntemini kullanıyoruz.
  • Sayı Ayrıştırma: int.TryParse() kullanımı, bir dize segmentinin bir tam sayıya dönüştürülüp dönüştürülemeyeceğini güvenli bir şekilde kontrol etmemizi sağlar; bu da bir istisna fırlatmaz.
  • Aralık Yönetimi: Tire içeren segmentlerde, başlangıç ve bitiş noktalarını çıkarmak için doğrulama yapar ve ayırırız.
  • Değerleri Geri Verme: yield ifadesi, yöntemin değerleri birer birer geri vermesine izin vererek, ayrıştırıcıya yapılan çağrılar için daha verimli olmasını sağlar.

Sonuç

C#‘de sayfa numarası dizelerini ayrıştırmak, ilk bakışta zorlayıcı görünebilir, ancak doğru yaklaşımla basit ve verimli hale getirilebilir. Dize manipülasyonu ve temel C# yapıları kullanarak, yeniden icat etmeksizin çeşitli girdi formatlarını yönetebilirsiniz. Bu yöntem, daha karmaşık durumlar meydana geldiğinde çözümünüzü kolayca genişletip uyarlamanıza olanak sağlar.

Özetlemek gerekirse, yerleşik bir özellik aramak yerine, gereksinimlerinizi karşılayan özel bir işlev oluşturabilirsiniz - bu da kodunuzun daha temiz ve geliştirme sürecinizin daha sorunsuz olmasını sağlar.

Bu yaklaşımı projelerinize uyarlamaktan çekinmeyin ve deneyimlerinizi aşağıdaki yorumlarda paylaşın!