我常常須要按值排序字典,包括鍵和值。 例如,我有一個單詞和各自頻率的哈希,我想按頻率排序。 數據庫
有一個SortedList
適用於單個值(好比頻率),我想將它映射回單詞。 數據結構
SortedDictionary按鍵排序 ,而不是值。 有些人訴諸於自定義課程 ,可是有更清潔的方法嗎? oop
排序值 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
您能夠按值對Dictionary進行排序,並使用如下代碼在字典中獲取結果: 排序
Dictionary <<string, string>> ShareUserNewCopy = ShareUserCopy.OrderBy(x => x.Value).ToDictionary(pair => pair.Key, pair => pair.Value);
使用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
您不對字典中的條目進行排序。 .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); }
鑑於你有一本字典,你可使用下面的一個班輪直接對它們進行排序:
var x = (from c in dict orderby c.Value.Order ascending select c).ToDictionary(c => c.Key, c=>c.Value);