Merhabalar, C# Dizi İçerisinde Arama Yapmak yazım ile C# yazılarıma devam ediyorum. Uzun zamandır C# ile ilgili yazılar yazmıyordum. Gerçi yine uzun zamandır C# ile ilgili bir iş de yapmıyorum. Komple Webe dönmüş durumdayım. Ama daha önceleri yazacağım diye listeme aldığım konulardan biriside buydu. Listeyi kısaltmak için yazmak istedim. :D
C# Dizi İçerisinde Arama Yapmak
Bu yazıda kullanılan konular. EqualityComparer bulduğum örneklerden bir tanesi idi ama hiç kullanmadım. Konumuzun kapsamına girdiği için örneklere ekledim. İlgili maddeden microsoft’un sitesindeki dökümanına ulaşabilirsiniz.
Bu yazıda göreceğimiz birden fazla konu var.
- Class Kullanımı
- Extension Class Kullanımı
- Summary Kullanımı
- Dizi İçerisinde Arama Yapmak
- İndexOf Metodu
- FindIndex Metodu
- Enumrable (LINQ) First Metodu
- Try Catch Kullanımı (Örnekli Anlatım, Ayrıntılı Anlatım)
- Enumrable (LINQ) FirstOrDefault Metodu
- Performing Linear Search
- Switch Case Kullanımı
C# Dizi İçerisinde Arama Yapmak
Elimizde bu işi yapmak için 5 farklı yol var. Yukarıdaki maddelerde yer alan konuları kullanarak bu 5 yöntemi tek tek göreceğiz. İlk olarak sadece öyle tercih ettiğim için MyArray adında bir class tanımladım ve dizimiz bu class içerisinde tanımlandı.
using System; namespace mustafabukulmez_com_dersler._047_Dizideki_Bir_Elemanın_Indeksini_Bulmak { public class MyArray // public her yerden erişilebilir kılar { public static int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; } }
Dizimizi bu class üzerinden kullanacağız. Sonrasında Extension Methods için bir class tanımlıyoruz ve tüm metotlarımız bu class içerisinde olacak. Metotları overload metot (Bu da diğer yazım) olarak yapmak istedim ancak mantıklı gelmediği için farklı isimlerle bağımsız olarak oluşturdum.
Şimdi sadece class tanımlamasını vereceğim. Metotlarımızı yazının devamında adım adım ekleyeceğiz.
using System; using System.Collections.Generic; using System.Linq; namespace mustafabukulmez_com_dersler._047_Dizideki_Bir_Elemanın_Indeksini_Bulmak { // extension, bir genişletme sınıfıdır. sık sık kullandığımız *.ToString() gibi bir kullanım kazandırır. public static class MyExtensions { } }
Bu bizim Extension Class yani genişletme sınıfımız olacak. (Geçmiş yazılarım part1, part2, part3)
Şimdi metotlarımıza geçelim. Önce metotları tek tek vereceğim sonrada form tasarımı ile birlikte nasıl kullanıldıklarını vereceğim.
1 – IndexOf
Bu metotta IndexOf metodunu kullanacağız.
/// <summary> /// Array içerisinde -IndexOf- metodu arama yapan ve index numarasını dönen metot. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="array">İçinde arama yapılacak array</param> /// <param name="item">Aranacak eleman</param> /// <returns>Aranacak elemanın array içerisindeki index numarası</returns> public static int findIndex_IndexOf<T>(this T[] array, T item) { return Array.IndexOf(array, item); }
IndexOf metodu bize dizi içerisinde aradığımız elemanın kaçıncı indexte olduğunu verir. Eğer dizi de yok ise -1 döner.
2 – FindIndex
/// <summary> /// Array içerisinde -FindIndex- metodu arama yapan ve index numarasını dönen metot. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="array">İçinde arama yapılacak array</param> /// <param name="item">Aranacak eleman</param> /// <returns>Aranacak elemanın array içerisindeki index numarası</returns> public static int findIndex_FindIndex<T>(this T[] array, T item) { return Array.FindIndex(array, val => val.Equals(item)); }
FindIndex metodu bize dizi içerisinde aradığımız elemanın kaçıncı indexte olduğunu lambda kullanımı ile verir. Eğer dizi de yok ise -1 döner.
3 – Enumrable (LINQ) First
/// <summary> /// Array içerisinde -Enumrable ve First- metodu arama yapan ve index numarasını dönen metot. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="array">İçinde arama yapılacak array</param> /// <param name="item">Aranacak eleman</param> /// <returns>Aranacak elemanın array içerisindeki index numarası</returns> public static int findIndex_EnumrableFirst<T>(this T[] array, T item) { try { return array .Select((element, index) => new KeyValuePair<T, int>(element, index)) .First(x => x.Key.Equals(item)).Value; } catch (InvalidOperationException) { return -1; } }
Burada Enumrable kullanarak LINQ ‘in First() metodu ile arama yapıyoruz. Burada First() metodu elemanı dizide bulamayınca hata vereceği için TRY Catch ile hatayı önlüyoruz. Bulamayınca hata vereceğini bildiğimiz içinde, hata verirse -1 gönderiyoruz.
4 – Enumrable (LINQ) FirstOrDefault
/// <summary> /// Array içerisinde -Enumrable ve FirstOrDefault- metodu arama yapan ve index numarasını dönen metot. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="array">İçinde arama yapılacak array</param> /// <param name="item">Aranacak eleman</param> /// <returns>Aranacak elemanın array içerisindeki index numarası</returns> public static int findIndex_EnumrableFirstOrDefault<T>(this T[] array, T item) { // FirstOrDefault() metodunu, Try catch ve First(): bloğu yerine kullanabilirsiniz. return array .Select((element, index) => new { element, index }) .FirstOrDefault(x => x.element.Equals(item))?.index ?? -1; }
First()‘in askine FirstOrDefault() aranan elemanı bulamayınca hata vermeyeceği için TRY Catch kullanmamıza gerek kalmıyor. Aynı şekilde eleman dizide bulunamazsa -1 döner.
5 – Performing Linear Search
/// <summary> /// Array içerisinde -Performing Linear Search- yöntemi arama yapan ve index numarasını dönen metot. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="array">İçinde arama yapılacak array</param> /// <param name="item">Aranacak eleman</param> /// <returns>Aranacak elemanın array içerisindeki index numarası</returns> public static int findIndex_PerformingLinearSearch<T>(this T[] array, T item) { EqualityComparer<T> comparer = EqualityComparer<T>.Default; for (int i = 0; i < array.Length; i++) { if (comparer.Equals(array[i], item)) { return i; } } return -1; }
EqualityComparer ‘i daha önce hiç kullanmadım ve neredeyse hiçbir eğitim setinde de anlatıldığını görmedim. Anladığım kadarı ile temel kullanım amacı bu değil. O yüzden Burada anlatacak bir şey yok. Amacımızı karşılıyor ve kullanmak isteyen kullanabilir.
Metotları Kullanmak
Şimdi metotları nasıl kullandığımızı görelim. Önce yaptığım form tasarımını veriyorum.
Soldaki bir çok dersi topladığım bir projenin ana ekranıdır. Yazının sonunda ilgili projenin linkine ulaşabilirsiniz. Bu derste o projedeki 47. derstir. Sağ tarafta ise bu projenin form tasarımını görebilirsiniz.
NOT: Çizgiler panel ile yapıldı. Desing tarafında genişliği veya yüksekliği min 10 px olarak ayarlayabiliyorsunuz ama Property kısmından elle 1px olarak ayarlayabilirsiniz.
Tasarımda da görebildiğiniz gibi her metot için bir button yer alıyor ve sonuçlar metot adı ile birlikte sağdaki labelde gösteriliyor. Aşağıdaki görselde görebilirsiniz.
Şimdi Form1’in kodlarını vereceğim.
Beni takip eden herkes bilir ki aynı kodları tekrar tekrar yazmak bana terstir o yüzden bir metot daha hazırladım. İşte o metot.
void find(string metot) { try { int item = Convert.ToInt16(txt_Sayi.Text); int index = 0; switch (metot) { case "IndexOf": index = MyArray.array.findIndex_IndexOf(item); lbl_Sonuc.Text = metot + ": İndex numarası: " + index; break; case "FindIndex": index = MyArray.array.findIndex_FindIndex(item); lbl_Sonuc.Text = metot + ": İndex numarası: " + index; break; case "Enumrable_First": index = MyArray.array.findIndex_EnumrableFirst(item); lbl_Sonuc.Text = metot + ": İndex numarası: " + index; break; case "Enumrable_FirstOrDefault": index = MyArray.array.findIndex_EnumrableFirstOrDefault(item); lbl_Sonuc.Text = metot + ": İndex numarası: " + index; break; case "Performing_Linear_Search": index = MyArray.array.findIndex_PerformingLinearSearch(item); lbl_Sonuc.Text = metot + ": İndex numarası: " + index; break; } } catch (Exception) { txt_Sayi.Text = "0"; MessageBox.Show("Lütfen bir sayı giriniz."); } }
Bu metot bir parametre alıyor. Parametreden gelen değere göre ilgili case çalıştırılıyor. Bu metodu hazırlamaktaki amacım, textbox’tan girilen ifadenin sayı olup olmaması durumunu kontrol etmektir. Ben burada sadece sayı girilmesini istiyorum. Sizin diziniz farklı veri tiplerinde ise örneğin string ise bu TRY Catch ‘a ihtiyacınız olmayacaktır.
Aşağıdaki kodlarda buttonların click eventleridir.
private void btn_IndexOf_Click(object sender, EventArgs e) { find("IndexOf"); } private void btn_FindIndex_Click(object sender, EventArgs e) { find("FindIndex"); } private void btn_Enumrable_First_Click(object sender, EventArgs e) { find("Enumrable_First"); } private void btn_Enumrable_FirstOrDefault_Click(object sender, EventArgs e) { find("Enumrable_FirstOrDefault"); } private void btn_Performing_Linear_Search_Click(object sender, EventArgs e) { find("Performing_Linear_Search"); }
Son… Tüm kodlara Github Projemden ulaşabilirsiniz.
C# Dizi İçerisinde Arama Yapmak yazımızda buraya kadardı. Linktree üzerinden bağlantılarıma ulaşabilirsiniz. İşte Burada
Derslerime özel olarak hazırladığım Github Projeme buradan ulaşabilirsiniz… Bu dersin kodları da dersler projesinde yer almaktadır. C# Eğitim Seti eğitimi sayfasına gitmek için tıklayınız.
Discord’a katılmayı unutmayın. Kesin gelin. :) Günün büyük bölümü aktifim ve sorularınızı ilk fırsatta cevaplıyorum.
Sağlıcakla ve kodla kalın….