Nasıl değerine göre bir sözlük sıralarım?

oy
671

Sık sık değerine göre, anahtarlar ve değerler oluşan bir sözlük sıralamak gerekiyor. Örneğin, I frekansı tarafından sipariş etmek istiyorum kelime ve karşılık gelen frekanslarda, bir karma sahiptir.

Bir Orada SortedListtek bir değer için iyi olan geri kelimenin eşlemek istediğiniz, (frekansını demek).

SortedDictionary anahtar, değere göre değil, emirleri. Bir Bazı çare özel bir sınıf , ama daha temiz bir yolu var mı?

Oluştur 02/08/2008 saat 01:40
kaynak kullanıcı
Diğer dillerde...                            


17 cevaplar

oy
473

LINQ kullanın:

Dictionary<string, int> myDict = new Dictionary<string, int>();
myDict.Add("one", 1);
myDict.Add("four", 4);
myDict.Add("two", 2);
myDict.Add("three", 3);

var sortedDict = from entry in myDict orderby entry.Value ascending select entry;

Bu aynı zamanda ilk 10 seçebilmesi ile büyük bir esneklik, 20% 10, vs. sağlayacak Yoksa için kelime sıklığı endeksi kullanıyorsanız type-ahead, ayrıca içerebilir StartsWithyanı maddesini.

Cevap 04/08/2008 saat 16:22
kaynak kullanıcı

oy
459

kullanın:

using System.Linq.Enumerable;
...
List<KeyValuePair<string, string>> myList = aDictionary.ToList();

myList.Sort(
    delegate(KeyValuePair<string, string> pair1,
    KeyValuePair<string, string> pair2)
    {
        return pair1.Value.CompareTo(pair2.Value);
    }
);

.NET 2.0 veya üzeri hedefliyorsanız olduğundan, lambda sözdizimi içine bu kolaylaştırabilirsiniz - bu eşdeğer ama kısa. .NET 2.0 hedefliyorsanız Visual Studio 2008 (veya üstü) gelen derleyici kullanıyorsanız sadece bu sözdizimini kullanabilirsiniz.

var myList = aDictionary.ToList();

myList.Sort((pair1,pair2) => pair1.Value.CompareTo(pair2.Value));
Cevap 02/08/2008 saat 02:15
kaynak kullanıcı

oy
179
var ordered = dict.OrderBy(x => x.Value);
Cevap 11/11/2010 saat 18:16
kaynak kullanıcı

oy
148

Etrafa, ve biz bu yapabileceğiniz bazı C # 3.0 özellikleri kullanarak:

foreach (KeyValuePair<string,int> item in keywordCounts.OrderBy(key=> key.Value))
{ 
    // do something with item.Key and item.Value
}

Bu benim gördüğüm en temiz yoludur ve karmaları taşıma Yakut şekilde benzer.

Cevap 02/08/2008 saat 01:43
kaynak kullanıcı

oy
140

Sen değerine göre bir Sözlüğü sıralayabilir ve (bunun üstesinden foreach zaman değerleri sırayla çıkıp böylece) kendisine geri kaydedebilirsiniz:

dict = dict.OrderBy(x => x.Value).ToDictionary(x => x.Key, x => x.Value);

Tabii, bu doğru olmayabilir, ama işe yarıyor.

Cevap 22/06/2011 saat 11:26
kaynak kullanıcı

oy
56

Yüksek düzeyde üzerinden bütün Sözlüğü ile yürümek ve her değer bakmak sonra başka bir seçenek yok.

Belki bu yardımcı olur: http://bytes.com/forum/thread563638.html kopyala / John Timney yapıştırılıyor:

Dictionary<string, string> s = new Dictionary<string, string>();
s.Add("1", "a Item");
s.Add("2", "c Item");
s.Add("3", "b Item");

List<KeyValuePair<string, string>> myList = new List<KeyValuePair<string, string>>(s);
myList.Sort(
    delegate(KeyValuePair<string, string> firstPair,
    KeyValuePair<string, string> nextPair)
    {
        return firstPair.Value.CompareTo(nextPair.Value);
    }
);
Cevap 02/08/2008 saat 01:47
kaynak kullanıcı

oy
22

Zaten bir sözlük sıralamak mümkün olmam. Aslında sipariş edilmez. Bir sözlükte için garanti anahtar ve değer koleksiyonları tekrarlanabilir olduğundan ve değerler indeksi veya anahtar tarafından alınabilmesi, ama burada herhangi bir düzenin garantisi değildir. Dolayısıyla bir liste halinde adı değer çiftini almak gerekir.

Cevap 19/12/2008 saat 23:47
kaynak kullanıcı

oy
16

Sen Sözlük girişleri sıralamak yoktur. NET'te Sözlük sınıf bir HashTable olarak uygulanır - bu veri yapısı tanımı gereği sıralanabilir değil.

Eğer (anahtarına göre) Topluluk içinde yineleme edebilmek için gerekirse - Bir İkili Arama Ağacı olarak uygulanan SortedDictionary, kullanmak gerekir.

farklı bir alana göre sıralanır çünkü durumda, ancak kaynak yapısı, önemsiz. Hala frekansa göre sıralayabilir ve ilgili alan (frekans) olanlar yeni bir koleksiyon koymak gerekir. Yani bu koleksiyonunda frekansları anahtarları ve sözcükler değerlerdir. pek çok kelime aynı frekansa sahip olabilir (ve bir anahtar olarak kullanmak için gidiyoruz) beri Sözlük ne de SortedDictionary (bunlar benzersiz anahtarları gerektirir) ne kullanamazsınız. Bu SortedList size bırakır.

Eğer ana / ilk sözlükte özgün öğenin bağlantısını sürdürmek ısrar neden anlamıyorum.

Koleksiyonunuzdaki nesneler daha karmaşık bir yapıya (daha fazla alan) vardı ve verimli bir şekilde erişim / tuşları olarak birçok farklı alanda kullanarak bunları sıralamak mümkün Gerekirse - Muhtemelen ana depolama oluşacak bir özel veri yapısını ihtiyacı olduğu bildirildi destekleyen O (1) monte edilmesi ve çıkarılması (LinkedList) ve çok sayıda indeksleme yapısı - Sözlükler / SortedDictionaries / SortedLists. Bu endeksler bir anahtar ve bir değer olarak LinkedList içinde LinkedListNode bir işaretçi / referans olarak karmaşık sınıfından alanlardan birini kullanabilirsiniz.

Ben düşünürdüm oldukça pahalı olur ana koleksiyon (LinkedList) ve kaldırma ile senkronize olan endeksler tutmak eklemeleri ve uzaklaştırmaları koordine etmek gerekir. onlar aramalar için fantastik ama birçok insetions ve silme gerçekleştirmek için gerektiğinde onlar bir yük haline - Bu veritabanı indeksleri nasıl çalıştığını benzer.

Bazı taramalı ağır işleme yapacağız eğer Yukarıdakilerin hepsi sadece haklı. Eğer sadece bir kez sıklığına göre sıralanır onları çıkışa gerekiyorsa o zaman sadece (anonim) tüp listeleriniz üretebilir:

var dict = new SortedDictionary<string, int>();
// ToDo: populate dict

var output = dict.OrderBy(e => e.Value).Select(e => new {frequency = e.Value, word = e.Key}).ToList();

foreach (var entry in output)
{
    Console.WriteLine("frequency:{0}, word: {1}",entry.frequency,entry.word);
}
Cevap 13/12/2012 saat 07:19
kaynak kullanıcı

oy
12
Dictionary<string, string> dic= new Dictionary<string, string>();
var ordered = dic.OrderBy(x => x.Value);
return ordered.ToDictionary(t => t.Key, t => t.Value);
Cevap 20/07/2015 saat 11:01
kaynak kullanıcı

oy
10

Sıralama değerleri

Bu Sözlük değerleri sıralamak nasıl göstermektedir. Biz Visual Studio ve vadede derlemek bir konsol programa bakınız. Bir Sözlük anahtarları ekler ve kendi değerlerine göre sıralar. Sözlük örnekleri başlangıçta herhangi bir şekilde sıralanır değil unutmayın. Bir sorgu açıklamada LINQ orderby anahtar kelime kullanın.

Sözlük [C #] sıralar OrderBy Clause Programı

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        // Example dictionary.
        var dictionary = new Dictionary<string, int>(5);
        dictionary.Add("cat", 1);
        dictionary.Add("dog", 0);
        dictionary.Add("mouse", 5);
        dictionary.Add("eel", 3);
        dictionary.Add("programmer", 2);

        // Order by values.
        // ... Use LINQ to specify sorting by value.
        var items = from pair in dictionary
                orderby pair.Value ascending
                select pair;

        // Display results.
        foreach (KeyValuePair<string, int> pair in items)
        {
            Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
        }

        // Reverse sort.
        // ... Can be looped over in the same way as above.
        items = from pair in dictionary
        orderby pair.Value descending
        select pair;
    }
}

Çıktı

dog: 0
cat: 1
programmer: 2
eel: 3
mouse: 5
Cevap 20/07/2012 saat 10:49
kaynak kullanıcı

oy
10

Veya eğlence için bazı LINQ uzantısı iyilik kullanabilirsiniz:

var dictionary = new Dictionary<string, int> { { "c", 3 }, { "a", 1 }, { "b", 2 } };
dictionary.OrderBy(x => x.Value)
  .ForEach(x => Console.WriteLine("{0}={1}", x.Key,x.Value));
Cevap 30/06/2010 saat 12:12
kaynak kullanıcı

oy
9

Bir sıralama SortedDictionarylistesi bir içine bağlamak için ListViewVB.NET kullanarak kontrol:

Dim MyDictionary As SortedDictionary(Of String, MyDictionaryEntry)

MyDictionaryListView.ItemsSource = MyDictionary.Values.OrderByDescending(Function(entry) entry.MyValue)

Public Class MyDictionaryEntry ' Need Property for GridViewColumn DisplayMemberBinding
    Public Property MyString As String
    Public Property MyValue As Integer
End Class

XAML:

<ListView Name="MyDictionaryListView">
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding Path=MyString}" Header="MyStringColumnName"></GridViewColumn>
            <GridViewColumn DisplayMemberBinding="{Binding Path=MyValue}" Header="MyValueColumnName"></GridViewColumn>
         </GridView>
    </ListView.View>
</ListView>
Cevap 23/04/2010 saat 10:36
kaynak kullanıcı

oy
5

İstediğiniz tüm Değer sıralama kriteri "geçici" listesi olması ise diğer cevaplar, iyidir. Eğer sıralama kriteri bir sözlük yapmak istiyorsanız Ancak, Keybu otomatik olarak senkronize göre sıralandı başka sözlükle Valuesen kullanabilirsiniz, Bijection<K1, K2>sınıf .

Bijection<K1, K2> Eğer bunlardan birini istiyorum sıralanmamış olması böylece, mevcut iki sözlükleri ile toplama başlatmak için izin verir ve diğeri, sizin gibi kodla bijection yaratabilecek sıralanmasını istediğiniz

var dict = new Bijection<Key, Value>(new Dictionary<Key,Value>(), 
                               new SortedDictionary<Value,Key>());

Sen kullanabilirsiniz dictherhangi bir normal Sözlük (o uygulayan gibi IDictionary<>) ve ardından aramak dict.Inversegöre sıralanır "ters" sözlüğü almak için Value.

Bijection<K1, K2>bir parçası olan Loyc.Collections.dll , ancak isterseniz, basitçe kopyalayabilirsiniz kaynak kodu kendi projeye.

Not durumda, kullanamaz aynı değere sahip birden fazla anahtar vardır: Bijectionancak elle sıradan arasındaki senkronize olabilir Dictionary<Key,Value>ve BMultiMap<Value,Key>.

Cevap 26/02/2016 saat 07:15
kaynak kullanıcı

oy
5

Sıralama yapıldığını Sözlük almanın en kolay yolu inşa kullanmaktır SortedDictionarysınıfın:

//Sorts sections according to the key value stored on "sections" unsorted dictionary, which is passed as a constructor argument
System.Collections.Generic.SortedDictionary<int, string> sortedSections = null;
if (sections != null)
{
    sortedSections = new SortedDictionary<int, string>(sections);
}

sortedSections irade ve sıralı sürümünü içeren sections

Cevap 02/04/2010 saat 23:36
kaynak kullanıcı

oy
4

Biz bir sözlük olduğunu varsayalım

   Dictionary<int, int> dict = new Dictionary<int, int>();
   dict.Add(21,1041);
   dict.Add(213, 1021);
   dict.Add(45, 1081);
   dict.Add(54, 1091);
   dict.Add(3425, 1061);
   sict.Add(768, 1011);

1) kullanabilirsiniz temporary dictionary to store values as:

        Dictionary<int, int> dctTemp = new Dictionary<int, int>();

        foreach (KeyValuePair<int, int> pair in dict.OrderBy(key => key.Value))
        {
            dctTemp .Add(pair.Key, pair.Value);
        }
Cevap 02/02/2015 saat 10:46
kaynak kullanıcı

oy
-2

Eğer bir sözlük var Verilen Bir astar aşağıda kullanarak değerler üzerinde doğrudan sıralayabilirsiniz:

var x = (from c in dict orderby c.Value.Order ascending select c).ToDictionary(c => c.Key, c=>c.Value);
Cevap 31/05/2014 saat 23:30
kaynak kullanıcı

oy
-2

Sen değeriyle Sözlük sıralamak ve aşağıdaki kodu kullanarak sözlükte sonucu alabilirsiniz:

Dictionary <<string, string>> ShareUserNewCopy = 
       ShareUserCopy.OrderBy(x => x.Value).ToDictionary(pair => pair.Key,
                                                        pair => pair.Value);                                          
Cevap 24/07/2012 saat 13:24
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more