Yazılım.
CevapSitesi.com Beta!
Çözüm Noktası
Facebook, Twitter, Google+ veya e-posta ile paylaşın.
| Sorular | Makaleler | Üyeler | Etiketler  | İletişim
Soru sormak ya da cevap vermek için;
giriş yapın veya üye olun.

Sosyal medya hesaplarınızla da giriş yapabilirsiniz.

Yazılım Soruları

0

C# Dictionary nasıl sıralanır?

C#'da Dictionary sınıfını çokca kullanıyorum. Bayağı hızlı olduğunu düşünüyorum. Ancak verileri sıralı olarak almak gerekiyor. Sözlüğü anahtara veya değere göre nasıl sıralayabilirim?

Soran:13.04.16 13:32
misafir  

1 Cevap

0
C# Dictionary sınıfının bir sıralama özelliği veya yöntemi yok. Ancak Dictionary'nin yeni bir şekli olan SortedDictionary ile değerlerin otomatik olarak anahtara göre sıralı halini elde edebilirsin. Ancak SortedDictionary Dictionary  sınıfından çok daha yavaş çalışıyor. Çok yoğun verilerle çalışıyorsanız tavsiye etmem. Bana göre Dictionary kullanıp sonradan sıralı halini almak daha iyi bir seçim.

Yine de seçim sizin tabiki. Ben altta her ikisi için de örnekler vereceğim.

Bir Dictionary nesnesinin elemanlarına anahtara göre sıralı halde ulaşmak

static void Main(string[] args)
{

    // Bir sözlük oluştur.
    Dictionary dictionary = new Dictionary<string, int>();

    // Sözlüğe bazı değerler ekle.
    dictionary.Add("klavye", 22);
    dictionary.Add("ekran", 11);
    dictionary.Add("masa", 30);
    dictionary.Add("sandalye", 5);
    dictionary.Add("fare", 13);

    // Anahtarları List sınıfından bir örneğe çevir
    // (List<String> döndürür ama tiplerle uğraşmak istemezseniz değişkeni var ile tanımlayın)
    var list = dictionary.Keys.ToList();

    // List nesnesini sırala
    list.Sort();
    
    // Eğer anahtar adlarında Türkçe karakterler (çşğı vs.) listenin sıralamasını
    // aşağıdaki gibi yapmalısınız.

    // list.Sort(StringComparer.Create(new System.Globalization.CultureInfo("tr-TR"), true));

    // Liste elemanlarını sıradan gezerek listedeki anahtara
    // sahip olan değerleri yaz.
    foreach (var key in list)
    {
        Console.WriteLine("{0}: {1}", key, dictionary[key]);
    }

    Console.ReadLine();

}

İkinci ve daha kısa bir yol.

static void Main(string[] args)
{

    // Bir sözlük oluştur.
    var dictionary = new Dictionary<string, int>();

    // Sözlüğe bazı değerler ekle.
    dictionary.Add("klavye", 22);
    dictionary.Add("ekran", 11);
    dictionary.Add("çasa", 30);
    dictionary.Add("ıandalye", 5);
    dictionary.Add("fare", 13);


    // LINQ sorgusuyla anahtara göre sıralı bir liste (IEnumerable) oluştur.
    var items = dictionary.OrderBy(i => i.Key);
    foreach (var item in items)
    {
        Console.WriteLine("{0}: {1}", item.Key, item.Value);
    }

    Console.ReadLine();

}


Bir Dictionary nesnesinin elemanlarına değere göre sıralı halde ulaşmak (LINQ ve Lambda İfadeleri kullanarak)

static void Main(string[] args)
{

    // Bir sözlük oluştur.
    var dictionary = new Dictionary<string, int>();

    // Sözlüğe bazı değerler ekle.
    dictionary.Add("klavye", 22);
    dictionary.Add("ekran", 11);
    dictionary.Add("çasa", 30);
    dictionary.Add("ıandalye", 5);
    dictionary.Add("fare", 13);


    // LINQ sorgusuyla sıralı bir liste (IEnumerable) oluştur.
    var items = from pair in dictionary
                orderby pair.Value ascending
                select pair;

    // Sonuçları göster
    foreach (KeyValuePair<string, int> pair in items)
    {
        Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
    }

    Console.ReadLine();

}
using kısmına System.Linq isim alanını dahil etmeyi unutmayın.

Veya daha kısa olarak şöyle yapılabilir.

static void Main(string[] args)
{

    // Bir sözlük oluştur.
    var dictionary = new Dictionary<string, int>();

    // Sözlüğe bazı değerler ekle.
    dictionary.Add("klavye", 22);
    dictionary.Add("ekran", 11);
    dictionary.Add("çasa", 30);
    dictionary.Add("ıandalye", 5);
    dictionary.Add("fare", 13);


    // LINQ sorgusuyla anahtara göre sıralı bir liste (IEnumerable) oluştur.
    var items = dictionary.OrderBy(i => i.Value);
    foreach (var item in items)
    {
        Console.WriteLine("{0}: {1}", item.Key, item.Value);
    }

    Console.ReadLine();

}




Cevaplayan: 13.04.16 11:06
cevapsitesi
102,034p 15ü
Cevabı seçen: 08.06.16 00:02
canora
101,387p 4ü