c# - reorder - dictionary sort python




你如何按價值對字典進行排序? (12)

使用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子句。

我經常不得不按價值排序包含鍵和值的字典。 例如,我有一個單詞和各自的頻率散列,我想按頻率排序。

有一個SortedList對單個值(比如頻率)很有用,我想將它映射回單詞。

SortedDictionary按鍵SortedDictionary ,而不是值。 有人訴諸自定義課程 ,但有更清晰的方法嗎?


使用:

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或更高版本,因此您可以將其簡化為lambda語法 - 它相同,但更短。 如果您的目標是.NET 2.0,則只有在使用Visual Studio 2008(或更高版本)的編譯器時才能使用此語法。

var myList = aDictionary.ToList();

myList.Sort((pair1,pair2) => pair1.Value.CompareTo(pair2.Value));

其他答案是好的,如果你想要的是有一個按價值排序的“臨時”列表。 但是,如果您希望按照Key排序的字典自動與按Value排序的另一個字典進行同步 ,則可以使用Bijection<K1, K2>

Bijection<K1, K2>允許您使用兩個現有字典初始化集合,因此如果您希望其中一個未排序,並且您希望另一個排序,則可以使用代碼創建雙射

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

你可以像任何普通字典一樣使用字典(它實現了IDictionary<> ),然後調用dict.Inverse獲得按Value排序的“inverse”字典。

Bijection<K1, K2>Loyc.Collections.dll一部分,但如果您願意,您可以將源代碼複製到您自己的項目中。

注意 :如果有多個具有相同值的鍵,則不能使用Bijection ,但可以在普通Dictionary<Key,Value>BMultiMap<Value,Key>之間手動同步。


在高層次上,你沒有其他選擇,然後遍歷整個詞典並查看每個值。

也許這會有所幫助: http://bytes.com/forum/thread563638.html ://bytes.com/forum/thread563638.html John Timney的複制/粘貼:

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

您不要對詞典中的條目進行排序。 .NET中的Dictionary類是作為散列表實現的 - 該數據結構不能按照定義進行排序。

如果你需要能夠迭代你的集合(通過鍵) - 你需要使用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);
}

您可以使用下面的代碼按值排序字典並使用字典獲得結果:

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

或者為了好玩,您可以使用一些LINQ擴展優點:

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

排序值

這將演示如何對Dictionary中的值進行排序。 我們看到一個控制台程序,您可以在Visual Studio中編譯並運行。 它將鍵添加到字典中,然後按照它們的值對它們進行排序。 請記住,詞典實例最初沒有以任何方式排序。 我們在查詢語句中使用LINQ orderby關鍵字。

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

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

獲得排序字典的最簡單方法是使用內置的SortedDictionary類:

//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將包含節的排序版本


環顧四周,並使用一些C#3.0功能,我們可以做到這一點:

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

這是我見過的最乾淨的方式,類似於處理散列的Ruby方式。


Dictionary<string, string> dic= new Dictionary<string, string>();
var ordered = dic.OrderBy(x => x.Value);
return ordered.ToDictionary(t => t.Key, t => t.Value);

var ordered = dict.OrderBy(x => x.Value);




dictionary