LINQ ile Kolayı Var #2

LINQ ile Kolayı Var‘ isimli serimize 2. yazıyla devam ediyoruz. Bu yazıda LINQ komutları kullanarak bir dizi, liste veya tablodaki eşsiz(unique) elemanları bulacağız. Ayrıca bu veri kümeleri içerisinde filtreleme yapacağız. Hadi başlayalım.

LINQ ile Eşsiz Değerleri Bulma

Diziler ve liste veri yapıları birbirine çok benzer. İkisinin de temel görevi aynı tipteki birden fazla değeri tutmaktır. Peki, elimizdeki dizi veya liste değişkeninde birbirinin aynısı olan değerler var ve ihtiyacımız eşsiz olan elemanları bulmaksa ne yapmalıyız? Bu küçük bir algoritma sorunu aslında. Birkaç komutluk bir algoritma ve döngü kurarak bu sorunu çözmek mümkündür. Hayatın her alanında olduğu gibi yazılımda da bir problemi çözmenin birden fazla yöntemi vardır.

Biz bugün bu sorunu LINQ komutları yardımıyla tek bir satır kodla çözeceğiz.

Liste değişkenimizin adı AnimalList olsun ve içerisinde aşağıdaki hayvan türlerini tutuyor olsun.

Eşek, At, Arı, Bukalemun, At, Köpek, Eşek, Kedi, At, Fare, Eşek, Bukalemun, Köpek, Kedi

Listede 14 eleman var. Ama kaç tane eşsiz eleman var dersek cevap 7. Aşağıdaki komutla AnimalList değişkenindeki eşsiz değerleri UnqAnimalList listesine atamak mümkün. Bu komutu hem C# hem de VB.NET’te kullanabilirsiniz.

UnqAnimalList = AnimalList.Distinct().ToList()

Bu kodun sonucunda UnqAnimalList değişkeninin içeriği aşağıdaki gibi olacaktır.

Eşek, At, Arı, Bukalemun, Köpek, Kedi, Fare

Peki ya liste yerine dizi üzerinde bu işlemi uygulasaydık ne olurdu? Cevabı aşağıda. Tek fark sondaki ToList() yerine ToArray() metodunu çağırmak. Bu komutu da hem C# hem de VB.NET üzerinde çalıştırabilirsiniz.

UnqAnimalArray = AnimalArray.Distinct().ToArray()

Evet ilk komutlarımızı öğrendik. Şimdi işi biraz daha zorlaştıralım ve iki boyutlu bir veri yapısı olan tablo(datatable) değişkenimizde bir kolondaki eşsiz değerleri bulalım. Aşağıdaki gibi bir tablomuz olduğunu düşünelim. Name, Job, Email kolonlarından oluşan bu tablodaki veriler içerisinden kaç tane birbirinden farklı(eşsiz) job olduğunu bulmak istiyoruz.

Bu tablonun dt_Users adlı bir System.Datatable değişkeninde saklı olduğunu varsayarsak komutumuz aşağıdaki gibi olacaktır. Bu komut VB.NET dilinde çalışacaktır ve UnqJobList değişkenine eşsiz meslekleri atayacaktır.

UnqJobList = dt_Users.AsEnumerable().Select(Function(x) x.Field(Of String)("Job")).Distinct().ToList()

Bu kodun sonucunda UnqJobList değişkeninin içeriği aşağıdaki gibi olacaktır.

Engineer, Teacher, Student

Aynı komutu C# ile yazmak istersek çok küçük sytanx farkından dolayı aşağıdaki gibi yazmalıyız.

UnqJobList = dt_Users.AsEnumerable().Select(x => x.Field<String>("Job")).Distinct().ToList();

LINQ ile Veri Filtreleme

Elimizde bir veri seti var bu veri seti içerisinde belirli bir koşula göre filtreleme yapmak istiyorsak ne yapmalıyız? İşte bu sorunun cevaplarından birisi LINQ komutu kullanmaktır. Veri filtreleme işlemini pek çok farklı yöntem veya aktivite ile yapmak mümkündür. Burada sadece bu işi LINQ ile nasıl yaparız onu göstereceğim.

Şimdi elimde SalaryArray isminde maaş ücretlerini tutan bir dizi olduğunu düşünelim. Bu dizi tamsayı(int) cinsinden değerler taşısın ve aşağıdaki değerleri tutuyor olsun.

10000, 42000, 27000, 38500, 17000, 51750, 39000

Şimdi bu dizideki sadece 30000 altındaki değerleri filtrelemek istiyorsak aşağıdaki komutu yazabiliriz.

VB.NET komutu aşağıdaki gibidir;

filteredSalaries = SalaryArray.Where(Function(x) x < 30000).ToArray()

C# komutu aşağıdaki gibidir;

filteredSalaries = SalaryArray.Where(x => x < 30000).ToArray();

Yukarıdaki komutun aynısını Liste veri tipi içinde kullanabilirsiniz. Sadece komut sonundaki ToArray() metodunu kaldırmalısınız.

Şimdiyse son olarak bir tabloda filtreleme nasıl yaparız onu göreceğiz. Yine aynı dt_Users tablosunu kullanabiliriz.

Aşağıdaki komut ile VB.NET dilinde bir tabloyu filtrelemeyi gösterdim. Buradaki Where metodunun içerisinde birden fazla koşul eklenebilir. Tabi bunu yapmak için mantıksal ifadeleri AND veya OR gibi anahtar kelimeler ile birleştirmeliyiz.

dt_Filtered = dt_Users.AsEnumerable().Where(Function(x) x.Field(of String)("Job").Equals("Engineer")).CopyToDataTable()

Yukarıdaki komutun aynısını C# diliyle yazmak isteseydik aşağıdaki gibi olmalıydı.

dt_Filtered = dt_Users.AsEnumerable().Where(x => x.Field("Job").Equals("Engineer")).CopyToDataTable();

Bir sonraki yazıda tekrar görüşmek dileğiyle, esen kalın…

Yorum bırakın

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.