C# Kimlik Numarası Kontrolü

Merhabalar, C# derslerimize kaldığımız yerden devam ediyoruz. Bu dersimizde T.C kimlik numarası kontrolü işlemlerini yapacağız. Ben sadece ilgili fonksiyonu yazacağım, siz ister Windows Forms, ister konsol, ister UWP yada farklı bir yapıda kullanabilirsiniz. Hadi başlayalım !
Öncelikle kimlik numarasının özelliklerinden bahsedelim, ki kodu neye göre yazdığımızı bilelim 🙂
- Kimlik numarası 11 haneden oluşmaktadır,
- Kimlik numarasının ilk hanesi sıfır olamaz,
- Kimlik numarasının ilk 10 hanesinin toplamının 10 ile modu 11. haneyi verir. Başka bir deyişle ilk 10 hanenin toplamının birler basamağı 11. haneyi verir,
- Kimlik numarasının 1, 3, 5, 7 ve 9. hanelerinin toplamının 7 katı ile 2, 4, 6 ve 8. hanelerinin toplamının farkının birler basamağı 10. haneyi verir.
Evet bu kurallara uygun olarak bi fonksiyon hazırlayalım. İlk olarak dışarıdan string tipte bir tane parametre alan ve geriye boolean değer döndüren bi fonksiyon yapısı hazırlayalım;
bool TcKimlikDogrulama(string tc){ }
string parametre aldık çünkü biz karakterler üzerinden işlem yapacağımız için bu string ifadesini integer dizisi haline çevireceğiz ve gerekli kontrolleri yaptıktan sonra doğru bir kimlik numarası ise true, yanlış ise false döndüreceğiz. Şimdi dışarıdan gelen string tipteki tc ifadesini Linq kullanarak integer dizisine çevirelim. Tabi bunun için öncelikle Linq kütüphanesini sayfaya eklemeliyiz. Bunun için sayfanın en başına
using System.Linq;
kod satırını ekleyelim. Ve ardından;
int[] dizi = tc.Select(x => Convert.ToInt32(x) - 48).ToArray();
kod satırı ile belirttiğim gibi integer dizisine çevirelim. Yazdığımız bu kodu açıklayacak olursak; Select fonksiyonu ile bi nevi foreach döngüsü döndürdük ve her adımda elimize gelen değeri x değişkenine atadık ve bu değişkeni integer’a çevirdik fakat x, char tipinde olduğu için integer’a çevirdiğimizde x’in ASCII karşılığı gelecektir, 48 çıkarırsak istediğimiz işlem yapılmış olacak. 48 çıkarmamızın sebebi ise, ASCII’den sayısal ifadeye çevirmek içindir. Şimdi de ilk kural olan kimlik numarasının 11 haneden oluşup oluşmadığını kontrol edip, 11’den farklı bi uzunlukta ise geriye false döndürelim;
if(dizi.Length != 11)
return false;
Şimdi ilk hanesi sıfır mı değil mi kontrol edip sıfır ise yine false döndürelim;
if(dizi[0] == 0)
return false;
Şimdi de ilk 10 hanesinin toplamını alıp birler basamağının 11. haneye eşit olup olmadığını kontrol edelim, eşit değilse yine false döndürelim;
if((dizi.Sum() - dizi[10]) % 10 != dizi[10])
return false;
Bu yazdığımız kodu açıklayacak olursak; Sum() fonksiyonu dizi elemanlarının toplamını verir fakat bize ilk 10 hanenin toplamı lazım olduğu için 11. haneyi geri çıkarıyoruz.
Şimdi de 1, 3, 5, 7 ve 9. hanelerinin toplamını bulalım;
int toplam1 = dizi[0] + dizi[2] + dizi[4] + dizi[6] + dizi[8];
Bunu da hallettik, şimdi de 2, 4, 6 ve 8. hanelerinin toplamını bulalım;
int toplam2 = dizi[1] + dizi[3] + dizi[5] + dizi[7];
Şimdi de toplam1 değişkeninin 7 katından toplam2 değişkenini çıkarıp sonucun birler basamağını alarak, bunun 10. karaktere eşit olup olmadığına bakalım. Eşit değilse geriye false döndürelim;
if((toplam1 * 7 - toplam2) % 10 != dizi[9])
return false;
Evet tüm kontrollerimiz bu kadar, bi sorun yoksa geriye true döndüreceğiz. Tüm yazdığımız kodu toplu olması için aşağıya bırakalım;
bool TcKimlikDogrulama(string tc)
{
int[] dizi = tc.Select(x => Convert.ToInt32(x) - 48).ToArray()
if(dizi.Length != 11)
return false;
if(dizi[0] == 0)
return false;
if((dizi.Sum() - dizi[10]) % 10 != dizi[10])
return false;
int toplam1 = dizi[0] + dizi[2] + dizi[4] + dizi[6] + dizi[8];
int toplam2 = dizi[1] + dizi[3] + dizi[5] + dizi[7];
if((toplam1 * 7 - toplam2) % 10 != dizi[9])
return false;
return true;
}
Bu dersimizde bu kadardı, tüm C# derslerimize buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.