using _25_HasArelationship._1_GokCisimleri.Entities;
using _25_HasArelationship._1_GokCisimleri.Entities.Bases;
using System.Globalization;
namespace _25_HasArelationship._1_GokCisimleri.Repositories
{
public class GokCismiRepo
{
private CultureInfo cultureInfo = new CultureInfo("tr-TR");
private List<GokCismiBase> _gokCisimleri;
/// <summary>
/// _gokCisimleri koleksiyonunu oluşturur.
/// </summary>
public GokCismiRepo()
{
_gokCisimleri= new List<GokCismiBase>();
Yildiz gunes = new Yildiz()
{
Adi = "Güneş",
KendiEtrafindaDonmeHizi = 2000,
SicaklikC = 5500,
YariCapi = 696340,
Gezegenler = new List<Gezegen>() // has-a relationship: bir yıldızın 0 veya daha çok gezegeni olabilir
};
Gezegen mars = new Gezegen()
{
Adi = "Mars",
KendiEtrafindaDonmeHizi = 3000,
YariCapi = 3389.5,
YasamVarMi = false,
//Uydular = new List<Uydu>(), // Gezegen class'ının constructor'ında zaten new'ledik,
// has-a relationship: bir gezegenin 0 veya daha çok uydusu olabilir
Yildiz = gunes // has-a relationship: bir gezegenin bir yıldızı olabilir
};
gunes.Gezegenler.Add(mars); // has-a relationship: yıldızın gezegenlerine gezegeni ekliyoruz
Gezegen dunya = new Gezegen()
{
Adi = "Dünya",
KendiEtrafindaDonmeHizi = 3500,
YariCapi = 6371,
YasamVarMi = true,
Yildiz = gunes // has-a relationship: bir gezegenin bir yıldızı olabilir
};
gunes.Gezegenler.Add(dunya); // has-a relationship: yıldızın gezegenlerine gezegeni ekliyoruz
Uydu ay = new Uydu()
{
Adi = "Ay",
YariCapi = 1737.4,
KendiEtrafindaDonmeHizi = 4000,
Gezegen = dunya // has-a relationship: bir uydunun bir gezegeni olabilir
};
dunya.Uydular.Add(ay); // has-a relationship: gezegenin uydularına uyduyu ekliyoruz
// gök cisimlerine yıldızı, gezegenleri ve uyduyu ekliyoruz
_gokCisimleri.Add(gunes);
_gokCisimleri.Add(mars);
_gokCisimleri.Add(dunya);
_gokCisimleri.Add(ay);
}
/// <summary>
/// _gokCisimleri koleksiyonu üzerinden Yildiz, Gezegen veya Uydu tiplerindeki elemanları içeren koleksiyonu döner.
/// </summary>
/// <returns>List<GokCismiBase></returns>
public List<GokCismiBase> Getir(GokCismiTipi tipi = GokCismiTipi.Tumu)
{
List<GokCismiBase> sonucGokCisimleri = new List<GokCismiBase>();
foreach (GokCismiBase gokCismi in _gokCisimleri)
{
if (gokCismi is Yildiz && tipi == GokCismiTipi.Yildiz)
{
//sonucGokCisimleri.Add(gokCismi as Yildiz); // Yildiz tipindeki eleman
sonucGokCisimleri.Add(gokCismi); // casting'e gerek yok çünkü gokCismi Yildiz tipindeki elemana refere ediyor
}
else if (gokCismi is Gezegen && tipi == GokCismiTipi.Gezegen)
{
//sonucGokCisimleri.Add(gokCismi as Gezegen); // Gezegen tipindeki eleman
sonucGokCisimleri.Add(gokCismi); // casting'e gerek yok çünkü gokCismi Gezegen tipindeki elemana refere ediyor
}
else if (gokCismi is Uydu && tipi == GokCismiTipi.Uydu)
{
//sonucGokCisimleri.Add(gokCismi as Uydu); // Uydu tipindeki eleman
sonucGokCisimleri.Add(gokCismi); // casting'e gerek yok çünkü gokCismi Uydu tipindeki elemana refere ediyor
}
else if (tipi == GokCismiTipi.Tumu)
{
sonucGokCisimleri.Add(gokCismi);
}
}
return sonucGokCisimleri;
}
/// <summary>
/// _gokCisimleri koleksiyonu üzerinden adiEsitMi parametresine göre adi parametresi
/// gök cismi adına eşit olan veya gök cismi adını içeren elemanları döner.
/// </summary>
/// <param name="adi"></param>
/// <param name="adiEsitMi"></param>
/// <returns>List<GokCismiBase></returns>
public List<GokCismiBase> Getir(string adi, bool adiEsitMi)
{
List<GokCismiBase> sonucGokCisimleri = new List<GokCismiBase>();
foreach (GokCismiBase gokCismi in _gokCisimleri)
{
if (adiEsitMi) // eşit: equals
{
// 1. yöntem:
//if (gokCismi.Adi.ToLower() == adi.ToLower().Trim()) // ToLower methodu ile eşitliğin iki tarafı için de
// büyük küçük harf duyarlılığını ortadan kaldırıyoruz,
// parametre olarak gelen adi içersindeki boşlukları da temizliyoruz
// 2. yöntem:
if (gokCismi.Adi.Equals(adi.Trim(), StringComparison.OrdinalIgnoreCase)) // Equals ve Contains methodları büyük küçük
// harf duyarlılığını ortadan kaldırmak için
// StringComparison enum'ı tipinde ikinci
// bir parametre de alabilir,
// OrdinalIgnoreCase üzerinden binary
// olarak büyük küçük harf duyarlılığı
// ortadan kaldırılabilir
{
sonucGokCisimleri.Add(gokCismi);
}
}
else // içeren: contains
{
// 1. yöntem:
//if (gokCismi.Adi.ToLower().Contains(adi.ToLower().Trim()))
// 2. yöntem:
if (gokCismi.Adi.Contains(adi.Trim(), StringComparison.OrdinalIgnoreCase))
{
sonucGokCisimleri.Add(gokCismi);
}
}
}
return sonucGokCisimleri;
}
/// <summary>
/// Parametre olarak gönderilen gokCisimleri koleksiyonundaki elemanları tiplerine göre konsola yazdırır.
/// </summary>
/// <param name="gokCisimleri"></param>
public void Yazdir(List<GokCismiBase> gokCisimleri)
{
Yildiz yildiz;
Gezegen gezegen;
Uydu uydu;
foreach (GokCismiBase gokCismi in gokCisimleri)
{
if (gokCismi is Yildiz)
{
yildiz = gokCismi as Yildiz;
Console.WriteLine("\nTipi: Yıldız\n" +
$"Adı: {yildiz.Adi}\n" +
$"Yarı Çapı: {yildiz.YariCapi.ToString(cultureInfo)} km\n" +
$"Kendi Etrafında Dönme Hızı: {yildiz.KendiEtrafindaDonmeHizi.ToString(cultureInfo)} km/h\n" +
$"Sıcaklık: {yildiz.SicaklikC.ToString(cultureInfo)} C ({yildiz.SicaklikF.ToString(cultureInfo)} F)");
if (yildiz.Gezegenler is not null) // if (yildiz.Gezegenler != null) da yazılabilir,
// yıldızın gezegenlerinin null olma ihtimali var
{
if (yildiz.Gezegenler.Count > 0)
{
Console.WriteLine("Gezegenler:");
foreach (Gezegen yildizGezegeni in yildiz.Gezegenler)
{
Console.WriteLine(yildizGezegeni.Adi);
}
}
}
}
else if (gokCismi is Gezegen)
{
gezegen = gokCismi as Gezegen;
Console.WriteLine("\nTipi: Gezegen\n" +
$"Adı: {gezegen.Adi}\n" +
$"Yarı Çapı: {gezegen.YariCapi.ToString(cultureInfo)} km\n" +
$"Kendi Etrafında Dönme Hızı: {gezegen.KendiEtrafindaDonmeHizi.ToString(cultureInfo)} km/h\n" +
$"Yaşam: {(gezegen.YasamVarMi ? "Var" : "Yok")}");
if (gezegen.Uydular.Count > 0) // gezegenin uydularının null olma ihtimali yok
// çünkü Gezegen sınıfının constructor'ında Uydular'ı new'ledik
{
Console.WriteLine("Uydular:");
foreach (Uydu gezegenUydusu in gezegen.Uydular)
{
Console.WriteLine(gezegenUydusu.Adi);
}
}
if (gezegen.Yildiz is not null) // if (gezegen.Yildiz != null) da yazılabilir,
// gezegenin yıldızının null olma ihtimali var
{
Console.WriteLine("Yıldız:\n" + gezegen.Yildiz.Adi);
}
}
else
{
uydu = gokCismi as Uydu;
Console.WriteLine("\nTipi: Uydu\n" +
$"Adı: {uydu.Adi}\n" +
$"Yarı Çapı: {uydu.YariCapi.ToString(cultureInfo)} km\n" +
$"Kendi Etrafında Dönme Hızı: {uydu.KendiEtrafindaDonmeHizi.ToString(cultureInfo)} km/h");
if (uydu.Gezegen is not null) // if (uydu.Gezegen != null) da yazılabilir,
// uydunun gezegeninin null olma ihtimali var
{
Console.WriteLine("Gezegen:\n" + uydu.Gezegen.Adi);
}
}
}
}
}
}