ArraySegment ve StringSegment Türleri ve Kullanımları

Merhaba,

Bu içeriğimizde bir referans tarafından işaretlenmiş dizi(array) üzerindeki bir aralığa farklı bir referans ile sahip olmamızı sağlayan ArraySegment<T> ve onun string türlerine karşılık muadili olan StringSegment türlerini inceliyor olacağız.

Nedir bu ArraySegment<T> ve StringSegment Türleri?

Bu türler yapısal olarak dizi yahut string ifadelerdeki bir bölümü temsil etmemizi sağlayan ve bütünsel açıdan ilgili veri kümesini parça parça birden fazla referans eşliğinde yönetmemize imkan veren struct türleridir.

ArraySegment<T>

ArraySegment<T> ve StringSegment Türleri ve Kullanımları
Bir dizinin bütününden ziyade belirli bir kısmına yahut parçasına ihtiyaç dahilinde ilgili diziyi kopyalamak yerine(ki görece oldukça maliyetli bir operasyondur) bağımsız bir referans ile erişmemizi ve böylece salt bir şekilde temsil etmemizi sağlayan bir yapıdır.

ArraySegment<T> oluşturabilmek için aşağıdaki gibi var olan bir dizi üzerinden değer üretilmesi yeterlidir.

            int[] number = { 3, 5, 7, 9, 11 };
            ArraySegment<int> segment1 = new ArraySegment<int>(number);
            //segment1 : 3 5 7 9 11
            ArraySegment<int> segment2 = new ArraySegment<int>(number, 2, 2);
            //segment2 : 7 9

Oluşturulan ArraySegment, operasyonel olarak referans ettiği dizinin tükettiği parçasına dair offset değeriyle birlikte birçok bilgisini bizlere sunmaktadır.

            int[] number = { 3, 5, 7, 9, 11 };
            ArraySegment<int> segment = new ArraySegment<int>(number, 2, 2);
            Console.WriteLine(segment.Offset); //2
            Console.WriteLine(segment.Count); //2
            Console.WriteLine(segment.Array.Length); //5

Böylece manevratik algoritmalar için gerekli kritik bilgilere erişebilmekteyiz.

Ayrıca yukarıda 5. satırda gördüğünüz üzere ArraySegment türünün ‘Array’ propertysi orjinal datayı bizlere getirmektedir. Buradan anlayacağımız bütünsel olarak bir dizinin bir alanını temsil eden bu ArraySegment nesnesi esasında arkaplanda yine aynı array’i kaynak olarak kullanmakta ve süreçte gerçekleşen tüm değersel operasyonlar ana array’e fiziksel olarak yansıtılmaktadır.

Şöyle ki;

            int[] number = { 3, 5, 7, 9, 11 };
            ArraySegment<int> segment = new ArraySegment<int>(number, 2, 2);
            segment[0] = 100;
            segment[1] = 200;

            for (int i = 0; i < number.Length; i++)
                Console.WriteLine(number[i]);

şeklinde inşa edilen komut çalıştırıldığında

3
5
100
200
11

çıktısını vermektedir.

Eğer ki kaynak array’in verilerini değiştirmek istemiyor ve orjinalliğini korumak istiyorsanız array’in bir kopyasını almanız gerekmektedir.

ArraySegment türleri üzerinde her türlü LINQ sorguları çalıştırılabilmektedir.

            int[] number = { 3, 5, 7, 9, 11 };
            ArraySegment<int> segment = new ArraySegment<int>(number, 2, 2);
            var data = segment.Where(n => n > 7);

Ve ayriyetten datalar üzerinde Slicing Support(Dilimleme Desteği) bulunmaktadır.

            int[] number = { 3, 5, 7, 9, 11 };
            ArraySegment<int> segment = new ArraySegment<int>(number, 2, 2);
            var p1 = segment.Slice(0, 1);
            var p2 = segment.Slice(1, 1);

StringSegment

StringSegment, ArraySegment’in string değerler nezdinde ki muadilidir diyebiliriz. Esasında metinsel değerlerdeki birçok analitik operasyonlardan bizleri kurtarmakta ve Substring vs. gibi fonksiyonlar yerine string değerde hedef kesit üzerinde işlem yapmamızı sağlamaktadır. Böylece işlem yapabilmek için yeni bir string değer üretilmeyeceğinden dolayı bellekte yersiz bir alan tahsisine gerek kalmadan performanslı bir şekilde işlemlerimizi gerçekleştirebilmekteyiz.

StringSegment’i kullanabilmek için Microsoft.Extensions.Primitives namespace’inin using edilmesi gerekmektedir.

            string text = "doldur be meyhaneci, boş kalmasın kadehim...";
            StringSegment segment1 = new StringSegment(text);
            //doldur be meyhaneci, boş kalmasın kadehim...
            StringSegment segment2 = new StringSegment(text, 0, 5);
            //doldu
            StringSegment segment3 = new StringSegment(text, 10, 10);
            //meyhaneci,

Nihai olarak;

ArraySegment ve StringSegment elimizdeki array değerlerin bir bölümünü temsil etmek ve böylece bellekte yersiz bir tahsis işlemine gerek kalmaksızın işlem gerçekleştirebilmek için geliştirilmiş struct’tırlar. İçeriğimizde de örneklendirildiği üzere genel geçer dizisel işlemlerde kullanıldıkları gibi elimizdeki dizinin belirli parçalarında MultiThread çalışmamız gereken uygulamalar yahut zamanlanmış görevlerde tüketilecek olan görev listesinin ayrı kesimlerinde işlev gerçekleştirilmesinden emin olunması gerektiği gibi kompleks noktalarda da güven içerisinde kullanılabilmektedirler.

ArraySegment ve StringSegment yapıları async metotlarda gönül rahatlığıyla kullanılabilmektedirler.

Sonraki yazılarımda görüşmek üzere…
İlgilenenlerin faydalanması dileğiyle…
İyi çalışmalar…

Kaynaklar
https://www.ilkayilknur.com/arraysegment-ve-stringsegment-nedir-nasil-kullanilir
https://docs.microsoft.com/tr-tr/dotnet/api/system.arraysegment-1?view=netcore-3.1
https://stackoverflow.com/questions/4600024/what-is-the-use-of-the-arraysegmentt-class
https://www.c-sharpcorner.com/article/c-sharp-arraysegment/

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*