C# SortedSet sınıfı

SortedSet sınıfı, .Net Framework 4.0 ile birlikte gelen en yeni sınıflardan biridir ve listesine eklenen elemanları sıralı bir şekilde tutar.

Bir örnek ile göstermek gerekirse;

public static void Main(string[] args) { var SiraliListe = new SortedSet<string>();

SiraliListe.Add("Engin");
SiraliListe.Add("Ahmet");
SiraliListe.Add("Mehmet");
SiraliListe.Add("Ayşe");
SiraliListe.Add("Fatma");

foreach (string s in SiraliListe)
{
    Console.WriteLine(s);
}

Console.ReadLine(); }</pre>

kodunun çıktısı aşağıdaki gibi olacaktır;

Ahmet
Ayşe
Engin
Fatma
Mehmet
public static void Main(string[] args)
{
    var SiraliListe = new SortedSet<int>() { 2, 5, 4, 6, 9, 3, 2, 8, 10, 7, 1 };

    foreach (int Sayi in SiraliListe)
    {
        Console.WriteLine(Sayi);
    }

    Console.ReadLine();
}
*Çıktı : *1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Tüm koleksiyonlara uygulayabildiğimiz Reverse() methodu SortedSet sınıfında da kullanılabiliyor;

public static void Main(string[] args)
{
    var SiraliListe = new SortedSet<int>() { 2, 5, 4, 6, 9, 3, 2, 8, 10, 7, 1 };

    foreach (int Sayi in SiraliListe.Reverse())
    {
        Console.WriteLine(Sayi);
    }

    Console.ReadLine();
}
*Çıktı : *10, 9, 8, 7, 6, 5, 4, 3, 2, 1

Clear() methodu, tüm elemanları silmeye yarıyor;

public static void Main(string[] args)
{
    var SiraliListe = new SortedSet() { 2, 5, 4, 6, 9, 3, 2, 8, 10, 7, 1 };

    SiraliListe.Clear();

    Console.ReadLine();
}

Min ve Max özellikleri sayesinde listedeki en küçük ve en büyük değerli elemanlara ulaşabiliriz;

public static void Main(string[] args)
{
    var SiraliListe = new SortedSet<int>() { 2, 5, 4, 6, 9, 3, 2, 8, 10, 7, 1 };

    Console.WriteLine("Min : {0}, Max : {1}", SiraliListe.Min, SiraliListe.Max);

    Console.ReadLine();
}
*Çıktı : *Min : 1, Max : 10


C# WMI Örnekler - 1

Bilgisayardaki Paylaşılan Dizinleri listelemek için; (Win32_Share sınıfını kullanır)

ManagementObjectSearcher mos = new ManagementObjectSearcher(“select * from win32_share”); foreach (ManagementObject mo in mos.Get()) { Console.WriteLine(“Dizin : {0}”, mo[“Name”]); }</pre>

Bilgisayarda Elle Başlatılan ve Çalışan Servisleri listelemek için; (Win32_Service sınıfını kullanır)

ManagementObjectSearcher mos = new ManagementObjectSearcher("Select * from Win32_Service Where State='Running' AND StartMode='Manual'");
foreach (ManagementObject mo in mos.Get())
{
    Console.WriteLine("Servis : {0}", mo["Name"]);
}

Bilgisayarda o anda Çalışmakta olan Process‘leri listelemek için; (Win32_Process sınıfını kullanır)

ManagementObjectSearcher mos = new ManagementObjectSearcher("Select * from Win32_Process");
foreach (ManagementObject mo in mos.Get())
{
    Console.WriteLine("Process : {0}", mo["Name"]);
}

Bilgisayarda bulunan İşlemcileri (CPU) listelemek için; (Win32_Processor sınıfını kullanır)

ManagementObjectSearcher mos = new ManagementObjectSearcher("Select * from Win32_Processor");
foreach (ManagementObject mo in mos.Get())
{
    Console.WriteLine("Process : {0}", mo["Name"]);
}

Win32 sınıflarının tamamına ve özelliklerine MSDN‘deki Win32 Classes sayfasından ulaşabilirsiniz.

Bilgisayarın WIFI sinyal seviyesini göstermek için; (Technet‘teki makaleden alıntıdır.)

ManagementObjectSearcher mos = new ManagementObjectSearcher(@"root\WMI", "select * from MSNdis_80211_ReceivedSignalStrength");
foreach (ManagementObject mo in mos.Get())
{
    Console.WriteLine("", mo["Ndis80211ReceivedSignalStrength"]);
}

Notebook’ta Kalan Pil Süresini göstermek için; (SystemInformation sınıfını kullanır)

Console.WriteLine("Kalan pil yüzdesi : {0}", SystemInformation.PowerStatus.BatteryLifePercent);

Console.WriteLine("Kalan pil süresi : {0}", SystemInformation.PowerStatus.BatteryLifeRemaining);


For - ForEach - List.ForEach performans karşılaştırması

Bir dizinin tüm elemanları üzerinde bir aksiyon gerçekleştirmemiz gerektiğinde, sıklıkla şu üç yoldan birini kullanırız;

  • For döngüsü
  • ForEach Döngüsü
  • List generic sınıfının ForEach extension method’u

Şimdi basit bir örnek ile bu üç yöntemi karşılaştıralım ()*;

( Not : Karşılaştırmalar; Windows7 64bit kurulu, Core2Duo 3.0 GHz ve 4 GB Ram’li bilgisayarımda yapılmıştır. Sadece fikir verme amaçlıdır, farklı durumlarda faklı sonuçlar ile karşılaşılabilir.)*

Öncelikle parametre olarak Generic List (List<T>) alan üç tane method yazalım;

private static long ToplamFor(List<int> Liste) { long Sonuc = 0; int ListeAdet = Liste.Count;

for (int iLoop = 0; iLoop &lt; ListeAdet; iLoop++)
    Sonuc += Liste[iLoop];

return Sonuc; }

private static long ToplamForEach(List<int> Liste) { long Sonuc = 0;

foreach (int Rakam in Liste)
    Sonuc += Rakam;

return Sonuc; }

private static long ToplamForEachExtension(List<int> Liste) { long Sonuc = 0;

Liste.ForEach(Rakam =&gt; Sonuc += Rakam);

return Sonuc; }</pre>

Aynı testi 10 defa gerçekleştirip, ortalamasını alacak bir test fonksiyonu yazalım. Yazacağımız fonksiyonu test listesinde olacak eleman adedini parametre olarak alacak;

private static void Testler(int ListeElemanAdet)
{
    List<int> ForSureler = new List<int>();
    List<int> ForEachSureler = new List<int>();
    List<int> ForEachExtensionSureler = new List<int>();

    List<int> TestVerisi = Enumerable.Range(0, ListeElemanAdet).ToList();

    Stopwatch sw = new Stopwatch();

    for (int iLoop = 0; iLoop < 10; iLoop++)
    {
        sw.Restart();
        ToplamFor(TestVerisi);
        sw.Stop();
        ForSureler.Add(sw.ElapsedTicks);

        sw.Restart();
        ToplamForEach(TestVerisi);
        sw.Stop();
        ForEachSureler.Add(sw.ElapsedTicks);

        sw.Restart();
        ToplamForEachExtension(TestVerisi);
        sw.Stop();
        ForEachExtensionSureler.Add(sw.ElapsedTicks);
    }

    Console.WriteLine("For Döngüsü ({0} Eleman) : {1}", ListeElemanAdet, ForSureler.Average());

    Console.WriteLine("ForEach Döngüsü ({0} Eleman) : {1}", ListeElemanAdet, ForEachSureler.Average());

    Console.WriteLine("ForEach Extension ({0} Eleman) : {1}", ListeElemanAdet, ForEachExtensionSureler.Average());
}

Artık uygulamamızın test fonksiyonunu kullanacak son kod parçasını yazabiliriz;

public static void Main(string[] args)
{
    Console.WriteLine("Test Başladı");

    Testler(1000);
    Testler(5000);
    Testler(10000);
    Testler(50000);
    Testler(100000);
    Testler(500000);
    Testler(1000000);
    Testler(5000000);
    Testler(10000000);
    Testler(50000000);

    Console.WriteLine("Test Bitti");

    Console.ReadLine();
}


Bakalım yaptığımız testler nasıl sonuç vermiş;

![For - ForEach - ForEach extension Performans Karşılaştırması / Ekran Görüntüsü](/assets/uploads/2010/10/For_ForEach_ForEachExtensionPerformansTest_0.png "For_ForEach_ForEachExtensionPerformansTest")

Sonuçlardan aşağıdaki tabloyu çıkarttım;
**Test Verisi** **For** **ForEach** **ForEach Extension**
*1.000* 71,1 121,5 79,7
*5.000* 34,3 92,2 55,6
*10.000* 70,0 185,1 110,4
*50.000* 349,3 918,4 568,3
*100.000* 715,2 1.902,7 1.159,0
*500.000* 3.583,3 9.379,3 5.600,0
*1.000.000* 7.260,4 18.877,9 11.242,8
*5.000.000* 37.927,2 96.096,9 57.845,4
*10.000.000* 74.553,5 192.621,6 115.559,6
*50.000.000* 371.698,1 956.394,4 572.776,7
İlk olarak **50.000 elemana** kadar olan listeler için **karşılaştırma** yapalım; ![For - ForEach - ForEach extension Performans Karşılaştırması / 50.000 elemana kadar inceleme](/assets/uploads/2010/10/For_ForEach_ForEachExtensionPerformansTest_1.png "For_ForEach_ForEachExtensionPerformansTest") Son olarak **50.000.000 elemana** kadar olan listeler için **karşılaştırma** yapalım; ![For - ForEach - ForEach extension Performans Karşılaştırması / 50.000.000 elemana kadar inceleme](/assets/uploads/2010/10/For_ForEach_ForEachExtensionPerformansTest_2.png "For_ForEach_ForEachExtensionPerformansTest")

Bu kodda ne yanlış var? – 7

Aşağıdaki kod sayesinde ekrana, listedeki isimleri küçük harflerle yazdırmak istiyorsunuz.

using System; using System.Collections.Generic;

public class EkranaYazdir { public static void Main() { List<string> Kisiler = new List<string>();

    Kisiler.Add("AHMET");
    Kisiler.Add("MEHMET");
    Kisiler.Add("AYŞE");
    Kisiler.Add("FATMA");

    /// string elemanları küçük harfe çevir
    Kisiler.ForEach(
        delegate(string k)
        {
            k = k.ToLower();
        }
    );

    /// console'a yaz
    Kisiler.ForEach(
        delegate(string s)
        {
            Console.WriteLine(s);
        }
    );
} }

MSDN‘de List<T>.ForEach() sayfasında;

Orjinali; Performs the specified action on each element of the List.

Türkçesi; Listedeki her eleman için belirlenmiş action çalıştırır.

yazısını okudunuz, ve kodun doğru çalışmasını bekliyorsunuz.

Fakat istediğiniz gibi çalışmıyor, sizce problem nedir ve nasıl düzeltilebilir?

Dosya uzantısını uygulamanız ile ilişkilendirin

Bir windows uygulaması geliştirdiniz ve uygulamanız belli uzantıdaki dosyalar üzerinde işlemler gerçekleştiriyor (Görüntüleme, Kaydetme, vs.)

Eğer ilgili uzantıdaki dosyaya çift tıklandığı zaman uygulamanızın açılmasını ve dosya üzerinde işlem yapmasını istiyorsanız, öncelikle dosya uzantısı ve uygulamanızı registry üzerinden birbiri ile ilişkilendirmelisiniz.

Aşağıdaki örnek kod sayesinde, eng uzantılı dosyaların uygulamanız ile ilişkilendirilmesini ve dosya ikonlarının sizin belirlediğiniz (icon.ico) olarak gözükmesini sağlayabilirsiniz;

Registry.ClassesRoot.CreateSubKey(“.eng”).SetValue(null, “EnginDosyasi.eng”);

RegistryKey rk = Registry.ClassesRoot.CreateSubKey(“EnginDosyasi.eng”); rk.CreateSubKey(“DefaultIcon”).SetValue(null, Application.StartupPath + “\icon.ico”); rk.CreateSubKey(@”shell\open\command”).SetValue(null, “"” + Application.ExecutablePath + “" "%1"”);</pre>

eng uzantılı bir dosyaya çift tıklandığında artık sizin uygulamanız açılacaktır.

Çift tıklandığı için uygulamanızı açtıran dosyaya, aşağıdaki kod satırı ile ulaşabilirsiniz;

public static void Main(string[] args)
{
    string Dosya = args[1];
}


Engin Polat hakkında

Senior Software Engineer, @Microsoft

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 484

Creative Commons Lisansı