你如何按價值排序字典?

我常常須要按值排序字典,包括鍵和值。 例如,我有一個單詞和各自頻率的哈希,我想按頻率排序。 數據庫

有一個SortedList適用於單個值(好比頻率),我想將它映射回單詞。 數據結構

SortedDictionary按鍵排序 ,而不是值。 有些人訴諸於自定義課程 ,可是有更清潔的方法嗎? oop


#1樓

排序值 spa

這顯示瞭如何對Dictionary中的值進行排序。 咱們看到一個能夠在Visual Studio中編譯並運行的控制檯程序。 它爲Dictionary添加了鍵,而後按其值對它們進行排序。 請記住,Dictionary實例最初不以任何方式排序。 咱們在查詢語句中使用LINQ orderby關鍵字。 指針

對字典[C#]進行排序的OrderBy子句程序 code

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;
    }
}

產量 對象

dog: 0
cat: 1
programmer: 2
eel: 3
mouse: 5

#2樓

您能夠按值對Dictionary進行排序,並使用如下代碼在字典中獲取結果: 排序

Dictionary <<string, string>> ShareUserNewCopy = 
       ShareUserCopy.OrderBy(x => x.Value).ToDictionary(pair => pair.Key,
                                                        pair => pair.Value);

#3樓

使用LINQ: 索引

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;

這也能夠提供很大的靈活性,你能夠選擇前10個,20個10%等。或者若是你使用你的單詞頻率索引進行type-ahead ,你也能夠包括StartsWith子句。 three


#4樓

您不對字典中的條目進行排序。 .NET中的字典類是做爲哈希表實現的 - 根據定義,此數據結構不可排序。

若是您須要可以迭代您的集合(按鍵) - 您須要使用SortedDictionary,它實現爲二進制搜索樹。

在您的狀況下,源結構是可有可無的,由於它按不一樣的字段排序。 您仍然須要按頻率對其進行排序,並將其放入按相關字段(頻率)排序的新集合中。 因此在這個集合中,頻率是鍵,單詞是值。 因爲許多單詞能夠具備相同的頻率(而且您將其用做鍵),所以您既不能使用Dictionary也不能使用SortedDictionary(它們須要惟一鍵)。 這將爲您提供SortedList。

我不明白爲何你堅持維護主/第一本詞典中原始項目的連接。

若是集合中的對象具備更復雜的結構(更多字段),而且您須要可以使用幾個不一樣的字段做爲鍵來有效地訪問/排序它們 - 您可能須要一個自定義數據結構,該結構將由主存儲組成支持O(1)插入和刪除(LinkedList)和幾個索引結構--Dictionaries / SortedDictionaries / SortedLists。 這些索引將使用複雜類中的一個字段做爲鍵,並將LinkedList中LinkedListNode的指針/引用用做值。

您須要協調插入和刪除以使索引與主集合(LinkedList)保持同步,而且刪除將是至關昂貴的我認爲。 這與數據庫索引的工做方式相似 - 它們很是適合查找,但當您須要執行許多限制和刪除時,它們會成爲負擔。

若是您要進行一些查找重處理,上述全部內容都是合理的。 若是您只須要按頻率排序就輸出它們,那麼您只需生成一個(匿名)元組列表:

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);
}

#5樓

鑑於你有一本字典,你可使用下面的一個班輪直接對它們進行排序:

var x = (from c in dict orderby c.Value.Order ascending select c).ToDictionary(c => c.Key, c=>c.Value);
相關文章
相關標籤/搜索