Birçok değeri tek isim altında tutmayı öğreniyorsun: sabit boyutlu diziler, esnek List<T> ve sensör verisi ortalaması örneği.
Dizi: sıralı kutular
5 sensörden gelen 5 sıcaklığı s1, s2, s3... diye ayrı değişkenlerde tutmak zordur. Dizi, aynı tipte birçok değeri yan yana ve numaralı biçimde saklar. Numaralara indeks denir ve 0'dan başlar.
double[] sicakliklar = { 21.5, 22.1, 20.9, 23.4, 22.8 };
Console.WriteLine(sicakliklar[0]); // ilk eleman: 21,5
Console.WriteLine(sicakliklar[4]); // son eleman: 22,8
Console.WriteLine(sicakliklar.Length); // eleman sayısı: 5
sicakliklar[2] = 21.0; // elemanı değiştir
Boş dizi oluşturmak için boyutu belirtirsin: int[] sayilar = new int[10]; (hepsi 0 ile başlar). Dizinin boyutu sonradan değişmez.
Sınır dışı: 5 elemanlı dizide dizi[5] yazarsan IndexOutOfRangeException hatası alırsın; geçerli indeksler 0-4'tür. "Bir eksik" hatası yeni başlayanların en sık hatalarındandır.
Dizi üzerinde işlem: ortalama
double[] olcumler = { 21.5, 22.1, 20.9, 23.4, 22.8 };
double toplam = 0;
double enBuyuk = olcumler[0];
double enKucuk = olcumler[0];
foreach (double deger in olcumler)
{
toplam += deger;
if (deger > enBuyuk) enBuyuk = deger;
if (deger < enKucuk) enKucuk = deger;
}
double ortalama = toplam / olcumler.Length;
Console.WriteLine($"Ortalama: {ortalama:F2} °C");
Console.WriteLine($"En düşük: {enKucuk}, en yüksek: {enBuyuk}");
Ortalama: 22,14 °C
En düşük: 20,9, en yüksek: 23,4
Toplam 110,7; beş değere bölünce 22,14 çıkar. İşte gerçek bir ölçüm yazılımının çekirdeği.
for ile indeksli gezinti
İndeksi bilmek istiyorsan for kullan:
string[] kanallar = { "CH1", "CH2", "CH3" };
for (int i = 0; i < kanallar.Length; i++)
{
Console.WriteLine($"{i}: {kanallar[i]}");
}
Array sınıfının yardımcıları
int[] sayilar = { 42, 7, 19, 3 };
Array.Sort(sayilar); // küçükten büyüğe
Console.WriteLine(string.Join(", ", sayilar));
Array.Reverse(sayilar); // tersine çevir
Console.WriteLine(string.Join(", ", sayilar));
Console.WriteLine(Array.IndexOf(sayilar, 19)); // 19'un indeksi
3, 7, 19, 42
42, 19, 7, 3
1
List<T>: büyüyüp küçülen liste
Dizinin boyutu sabittir. Kaç eleman geleceğini bilmediğinde (örneğin sensör çalıştıkça yeni ölçüm eklenecekse) List<T> kullanırsın. Buradaki T tür parametresidir: List<int> tam sayı listesi, List<string> metin listesidir.
var olcumler = new List<double>();
olcumler.Add(3.3);
olcumler.Add(3.1);
olcumler.Add(3.4);
olcumler.Insert(0, 3.0); // başa ekle
Console.WriteLine(olcumler.Count); // 4
olcumler.Remove(3.1); // değere göre sil
olcumler.RemoveAt(0); // indekse göre sil
Console.WriteLine(olcumler.Contains(3.4)); // True
foreach (var d in olcumler) Console.WriteLine(d);
4
True
3,3
3,4
Dizide eleman sayısına Length, listede Count denir; ikisini karıştırmak sık yapılan bir yanlıştır.
Sıralama ve arama
var notlar = new List<int> { 70, 45, 90, 62 };
notlar.Sort();
Console.WriteLine(string.Join(" ", notlar)); // 45 62 70 90
int ilkGecen = notlar.Find(n => n >= 60); // koşulu sağlayan ilk eleman
Console.WriteLine(ilkGecen); // 62
n => n >= 60 bir lambda ifadesidir: "n verilirse n'in 60'a büyük eşit olup olmadığını söyle" anlamına gelen küçük, adsız bir metot. Lambda'ları LINQ dersinde yoğun kullanacağız.
Hangisini seçeyim? Boyut baştan belli ve değişmeyecekse dizi; ekleme-silme olacaksa List<T>. Yeni kodda çoğunlukla List<T> kullanılır.
Kendin dene
Bir List<double> oluştur ve kullanıcıdan "bitti" yazana kadar gerilim ölçümleri iste (while ve TryParse ile). Sonunda kaç ölçüm alındığını, ortalamayı ve en büyük değeri yaz. Hiç ölçüm girilmediyse bölme hatası vermemek için kontrol ekle.
// Mini sınav
Bir seçeneğe tıkla; doğru mu yanlış mı, anında ve nedeniyle birlikte göreceksin.
Bitirdiğinde işaretle: ilerlemen kaydolur, +20 XP kazanırsın.
İpucu: ← → tuşlarıyla dersler arasında gezinebilirsin.