คุณเรียงลำดับพจนานุกรมตามค่าอย่างไร


796

ฉันมักจะต้องเรียงลำดับพจนานุกรมประกอบด้วยปุ่ม & ค่าตามค่า ตัวอย่างเช่นฉันมีคำและความถี่ที่เกี่ยวข้องซึ่งฉันต้องการเรียงลำดับตามความถี่

มีค่าSortedListซึ่งดีสำหรับค่าเดียว (ความถี่พูด) ที่ฉันต้องการแมปกลับไปที่คำว่า

คำสั่งSortedDictionaryตามคีย์ไม่ใช่ค่า รีสอร์ทบางแห่งในชั้นเรียนที่กำหนดเองแต่มีวิธีที่สะอาดกว่าไหม


1
นอกเหนือจากการเรียงลำดับพจนานุกรม (เช่นเดียวกับคำตอบที่ยอมรับแล้ว) คุณสามารถสร้างIComparerเคล็ดลับ (จริงว่ามันยอมรับคีย์เพื่อเปรียบเทียบ แต่ด้วยคีย์คุณจะได้รับค่า) ;-)
BrainSlugs83

คำตอบ:


520

ใช้:

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 หรือสูงกว่าคุณสามารถทำให้สิ่งนี้ง่ายขึ้นในรูปแบบแลมบ์ดา - ซึ่งเทียบเท่า แต่สั้นกว่า หากคุณกำหนดเป้าหมายเป็น. NET 2.0 คุณจะสามารถใช้ไวยากรณ์นี้ได้เฉพาะเมื่อคุณใช้คอมไพเลอร์จาก Visual Studio 2008 (หรือสูงกว่า)

var myList = aDictionary.ToList();

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

26
ฉันใช้วิธีแก้ปัญหานี้ (ขอบคุณ!) แต่สับสนเป็นเวลาหนึ่งนาทีจนกว่าฉันจะอ่านโพสต์ของ Michael Stum (และโค้ดของเขาจาก John Timney) และตระหนักว่า myList เป็นวัตถุรองรายการของ KeyValuePairs ซึ่งสร้างขึ้นจากพจนานุกรม แล้วเรียงลำดับ
Robin Bennett

113
มันเป็นหนึ่งซับ - คุณไม่จำเป็นต้องใส่เครื่องมือจัดฟัน มันสามารถเขียนใหม่เป็นmyList.Sort((x,y)=>x.Value.CompareTo(y.Value));
Arnis Lapsa

25
ในการเรียงลำดับจากมากไปน้อยสลับ x และ y ในการเปรียบเทียบ: myList.Sort ((x, y) => y.Value.CompareTo (x.Value));
อาร์ตูโร

8
ฉันคิดว่ามันน่าสังเกตว่ามันต้องใช้ Linq สำหรับวิธีการขยาย ToList
Ben

17
พวกคุณกำลังยุ่งอยู่กับเรื่องนี้ซับซ้อน - พจนานุกรมดำเนินไปแล้วIEnumerableดังนั้นคุณสามารถเรียงลำดับรายการดังนี้:var mySortedList = myDictionary.OrderBy(d => d.Value).ToList();
BrainSlugs83

523

ใช้ 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ประโยคได้ด้วย


15
ฉันจะเปลี่ยน sortDict กลับเป็น Dictionary <string, int> ได้อย่างไร โพสต์คำถาม SO ใหม่ที่นี่: stackoverflow.com/questions/3066182/…
Kache

1
น่าเสียดายที่นี่ใช้ไม่ได้กับ VS2005 เพราะ. NET Framework 2.0 นั้น (ไม่มี LINQ) มันเป็นการดีที่ได้คำตอบของ Bambrick เช่นกัน
Smalcat

22
ฉันไม่แน่ใจว่าจะใช้งานได้หรือไม่เพราะการวนซ้ำในพจนานุกรมไม่รับประกันว่า KeyValuePairs จะ "ดึง" ตามลำดับที่แทรกไว้ ดังนั้นมันไม่สำคัญว่าคุณจะใช้ orderby ใน LINQ เพราะพจนานุกรมสามารถเปลี่ยนลำดับขององค์ประกอบที่แทรกได้ ใช้งานได้ตามปกติ แต่ไม่มีการรับประกันโดยเฉพาะพจนานุกรมขนาดใหญ่
Bozydar Sobczak

16
ประเภทผลตอบแทนที่ควรจะเป็นหรือIEnumerable<KeyValuePair<TKey, TValue>> OrderedDictionary<TKey, TValue>หรือควรใช้ a SortedDictionaryตั้งแต่เริ่มต้น สำหรับธรรมดาDictionaryMSDN จะระบุอย่างชัดเจน "ลำดับที่ส่งคืนรายการนั้นไม่ได้กำหนด" ดูเหมือนว่าการแก้ไขล่าสุดของ @ rythos42 คือการตำหนิ :)
Boris B.

16
โปรดเพิกเฉยต่อคำแนะนำทั้งหมด.ToDictionary- พจนานุกรมมาตรฐานไม่รับประกันการเรียงลำดับ
AlexFoxGill

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

6
ฉันไม่แน่ใจว่าทำไมโซลูชันนี้จึงไม่เป็นที่นิยมมากขึ้น - อาจเป็นเพราะต้องใช้. NET 3.5
Contango

33
นี่เป็นทางออกที่ดี แต่ควรมีสิทธิ์นี้ก่อนเซมิโคลอนสิ้นสุด:. ToDictionary (คู่ => pair.Key, pair => pair.Value);
theJerm

3
@TheJerm โดยการวางรายการที่เรียงกลับไปยังพจนานุกรมจะรับประกันการสั่งซื้อหรือไม่ มันอาจใช้ได้วันนี้ แต่ไม่รับประกัน
nawfal

1
ใช้เฟรมเวิร์ก 4.5 เพียงตรวจสอบว่าไม่จำเป็นต้องแปลงกลับเป็นพจนานุกรม
Jagd

12
ไม่ควรมีการส่งกลับไปที่พจนานุกรมเนื่องจากพจนานุกรมไม่ได้รับคำสั่ง ไม่มีการรับประกันว่า KeyValuePairs จะอยู่ในลำดับที่คุณต้องการ
David DeMar

165

มองไปรอบ ๆ และใช้คุณสมบัติ C # 3.0 บางอย่างที่เราสามารถทำได้:

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

นี่เป็นวิธีที่สะอาดที่สุดที่ฉันเคยเห็นและคล้ายกับวิธีจัดการรูชของ Ruby


ฉันพยายามเรียงพจนานุกรมขณะที่เพิ่ม KeyValuePairs ใน ComboBox ... มันใช้งานได้ดีมาก! ขอบคุณ!
44904 Jason ลง

6
อย่าลืมเพิ่มเนมสเปซ System.Linq เมื่อใช้ไวยากรณ์นี้
M. Dudley

4
(for KeyValuePair<string, int> item in keywordCounts.OrderBy(key => key.Value) select item).ToDictionary(t => t.Key, t => t.Value)- เป็นเพียงส่วนเสริมเล็ก ๆ สำหรับคำตอบของคุณ :) ขอบคุณ btw :)
Andrius Naruševičius

7
@ AndriusNaruševičius: ถ้าคุณเพิ่มรายการส่งผลให้กลับเข้าไปในพจนานุกรมคุณจะทำลายคำสั่งที่เป็นพจนานุกรมไม่ได้รับประกันว่าจะได้รับการสั่งซื้อในแฟชั่นใด
หรือผู้ทำแผนที่

มันมีประโยชน์ จะกลับไปใช้วิธีอื่นได้อย่างไร?
Dan Hastings

158

คุณสามารถจัดเรียงพจนานุกรมตามค่าและบันทึกกลับไปที่ตัวเอง (เพื่อให้เมื่อคุณเห็นค่าที่ออกมาตามลำดับ):

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

แน่นอนว่ามันอาจไม่ถูกต้อง แต่ใช้งานได้


8
คุณยังสามารถใช้ OrderByDescending ได้หากคุณต้องการเรียงลำดับจากมากไปหาน้อย
Mendokusai

ทำงานให้ฉันแม้ว่าฉันจะต้องเปลี่ยนมันเล็กน้อยเป็น: Dictionary <key, value> dict = dict.OrderBy (x => x.Value). ToDictionary (x => x.Key, x => x.Value);
Josh

17
"การทำงาน" นี้ไม่รับประกัน มันเป็นรายละเอียดการใช้งาน มันไม่จำเป็นต้องทำงานอีกครั้ง คำตอบที่ไม่ถูกต้องลดลง
nawfal

4
เอาต์พุตพจนานุกรมไม่รับประกันว่าจะมีการเรียงลำดับเฉพาะใด ๆ
Roger Willcocks

5
ฉันค่อนข้างกังวลที่จะเห็นสิ่งนี้ในรหัสการผลิต ไม่รับประกันและสามารถเปลี่ยนแปลงได้ตลอดเวลา ไม่ว่าฉันจะอยู่ห่างจากวิธีแก้ปัญหาเชิงปฏิบัติเพียงแค่แสดงให้เห็นถึงการขาดความเข้าใจในโครงสร้างข้อมูล imo
jamespconnor

61

ในระดับสูงคุณไม่มีทางเลือกอื่นนอกจากเดินดูทั้งพจนานุกรมและดูแต่ละค่า

อาจช่วยได้: http://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);
    }
);

3
stringnextPair -> string> nextPair stringfirstPair -> string> firstPair
Art

2
โซลูชั่นที่ไม่ใช่ Linq ที่สมบูรณ์แบบ ไม่เคยทำให้ฉันประหลาดใจเลยว่าผู้คนรู้สึกอย่างไรที่ต้องใช้ Linq แม้ว่าจะไม่จำเป็นต้องแก้ปัญหาก็ตาม ด้วย C # 3 ฉันเชื่อว่าคุณสามารถลดความซับซ้อนของการเรียงเพื่อใช้แลมบ์ดา: myList.Sort ((x, y) => x.Value.CompareTo (y.Value));

25

คุณจะไม่สามารถเรียงลำดับพจนานุกรมได้ พวกเขาไม่ได้สั่งจริง การรับประกันสำหรับพจนานุกรมคือการรวบรวมคีย์และค่าสามารถทำซ้ำได้และค่าสามารถเรียกคืนได้โดยดัชนีหรือคีย์ แต่ไม่มีการรับประกันคำสั่งซื้อใด ๆ ดังนั้นคุณจะต้องได้รับคู่ค่าชื่อลงในรายการ


2
พจนานุกรมที่เรียงลำดับสามารถให้ผลลัพธ์รายการคู่คีย์ - ค่าได้
เรียกซ้ำ

1
@recursive พจนานุกรมใด ๆ ที่ควรให้ผลลัพธ์ ที่น่าสนใจที่จะทราบว่าคำตอบของฉันซึ่งถูกต้อง แต่ไม่สมบูรณ์ (อาจทำในสิ่งที่ทำตัวอย่างที่ดีกว่า) ได้รับการโหวตด้านล่างคำตอบที่ไม่ถูกต้องซึ่งจะส่งผลให้มีข้อยกเว้นค่าซ้ำกันในพจนานุกรมต้นฉบับ เป็น)
Roger Willcocks

5
นี่คือคำตอบ bes เพราะพจนานุกรมไม่สามารถเรียงลำดับได้ มันแฮชคีย์และคุณสามารถทำการค้นหาที่รวดเร็วที่สุดได้
Paulius Zaliaduonis

@NetMage ใช่ แต่อีกส่วนหนึ่งของปัญหาคือพวกเขาต้องการสั่งซื้อโดยคุ้มค่า และคุณสามารถทำได้โดยการสลับคีย์และค่า และคุณค่านั้นไม่จำเป็นต้องเป็นเอกลักษณ์ แต่สำคัญต้องเป็น
Roger Willcocks

ใช่ แต่ฉันคิดว่าคำตอบของคุณไม่ถูกต้องเนื่องจากมีข้อความที่สมบูรณ์
NetMage

21

คุณไม่เรียงลำดับรายการในพจนานุกรม คลาสพจนานุกรมใน. NET ถูกนำมาใช้เป็น hashtable - โครงสร้างข้อมูลนี้ไม่สามารถจัดเรียงตามนิยาม

หากคุณจำเป็นต้องสามารถวนซ้ำคอลเลกชันของคุณ (โดยคีย์) - คุณต้องใช้ SortedDictionary ซึ่งถูกนำมาใช้เป็นแผนผังการค้นหาแบบไบนารี

ในกรณีของคุณอย่างไรก็ตามโครงสร้างของแหล่งข้อมูลนั้นไม่เกี่ยวข้องเนื่องจากถูกจัดเรียงตามเขตข้อมูลอื่น คุณจะต้องเรียงลำดับตามความถี่และเก็บไว้ในคอลเล็กชันใหม่เรียงตามฟิลด์ที่เกี่ยวข้อง (ความถี่) ดังนั้นในคอลเล็กชั่นนี้ความถี่จึงเป็นกุญแจและคำเป็นค่า เนื่องจากคำหลายคำสามารถมีความถี่เท่ากัน (และคุณจะใช้เป็นคีย์) คุณจึงไม่สามารถใช้ทั้งพจนานุกรมและ SortedDictionary (ต้องใช้คีย์ที่ไม่ซ้ำกัน) สิ่งนี้ทำให้คุณมี SortedList

ฉันไม่เข้าใจว่าทำไมคุณยืนยันในการรักษาลิงก์ไปยังรายการต้นฉบับในพจนานุกรมหลัก / แรกของคุณ

หากวัตถุในคอลเลกชันของคุณมีโครงสร้างที่ซับซ้อนมากขึ้น (เขตข้อมูลเพิ่มเติม) และคุณจำเป็นต้องสามารถเข้าถึง / จัดเรียงได้อย่างมีประสิทธิภาพโดยใช้เขตข้อมูลที่แตกต่างกันเป็นคีย์ - คุณอาจต้องใช้โครงสร้างข้อมูลแบบกำหนดเองที่ประกอบด้วยหน่วยเก็บข้อมูลหลัก รองรับการแทรกและกำจัด O (1) (LinkedList) และโครงสร้างการจัดทำดัชนีหลายรายการ - พจนานุกรม / SortedDictionaries / SortedLists ดัชนีเหล่านี้จะใช้หนึ่งในฟิลด์จากคลาสที่ซับซ้อนของคุณเป็นคีย์และตัวชี้ / การอ้างอิงถึง LinkedListNode ใน LinkedList เป็นค่า

คุณจะต้องประสานงานการแทรกและการลบเพื่อให้ดัชนีของคุณตรงกับคอลเลกชันหลัก (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);
}

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

12

หรือเพื่อความสนุกคุณสามารถใช้ประโยชน์จากส่วนขยายของ 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));

10

การเรียงลำดับSortedDictionaryรายการเพื่อผูกเข้ากับListViewตัวควบคุมโดยใช้ VB.NET:

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>

7

วิธีที่ง่ายที่สุดในการรับพจนานุกรมที่เรียงลำดับคือการใช้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 จะมีรุ่นที่เรียงลำดับของ sections


7
ตามที่คุณพูดถึงในความคิดเห็นของคุณSortedDictionaryเรียงลำดับตามคีย์ OP ต้องการจัดเรียงตามค่า SortedDictionaryไม่ได้ช่วยในกรณีนี้
Marty Neal

ถ้าเขา / เธอ (คุณ) ทำได้แค่ตั้งค่าเป็นกุญแจ ฉันหมดเวลาการดำเนินการและsorteddictionary()ชนะอย่างน้อย 1 ไมโครวินาทีและจัดการได้ง่ายกว่า (เนื่องจากค่าใช้จ่ายในการแปลงกลับเป็นสิ่งที่โต้ตอบได้ง่ายและจัดการคล้ายกับพจนานุกรมคือ 0 (มีอยู่แล้วsorteddictionary))
mbrownnyc

2
@ mbrownnyc - ไม่ทำเช่นนั้นต้องมีการสันนิษฐานหรือเงื่อนไขที่ว่าค่านั้นไม่เหมือนใครซึ่งไม่รับประกัน
Roger Willcocks

6

คำตอบอื่น ๆ นั้นดีถ้าคุณต้องการมีรายการ "ชั่วคราว" เรียงตามค่า อย่างไรก็ตามหากคุณต้องการให้พจนานุกรมเรียงลำดับตามKeyที่ซิงโครไนซ์กับพจนานุกรมอื่นที่เรียงลำดับโดยอัตโนมัติValueคุณสามารถใช้Bijection<K1, K2>คลาสได้ได้

Bijection<K1, K2> ช่วยให้คุณสามารถเริ่มต้นการรวบรวมด้วยพจนานุกรมที่มีอยู่สองฉบับได้ดังนั้นหากคุณต้องการให้เรียงลำดับอย่างใดอย่างหนึ่งและคุณต้องการให้อีกอันเรียงลำดับคุณสามารถสร้าง biject ด้วยรหัสเช่น

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

คุณสามารถใช้dictเช่นพจนานุกรมปกติใด ๆ (มันดำเนินการIDictionary<K, V>) และแล้วโทรdict.Inverseจะได้รับ "ผกผัน" Valueพจนานุกรมซึ่งจะเรียงตาม

Bijection<K1, K2>เป็นส่วนหนึ่งของLoyc.Collections.dllแต่ถ้าคุณต้องการคุณสามารถคัดลอกซอร์สโค้ดลงในโครงการของคุณเอง

หมายเหตุ : ในกรณีที่มีหลายคีย์ที่มีค่าเดียวกันคุณไม่สามารถใช้Bijectionแต่คุณเองสามารถประสานระหว่างสามัญและDictionary<Key,Value>BMultiMap<Value,Key>


คล้ายกับhttp://stackoverflow.com/questions/268321แต่สามารถแทนที่พจนานุกรมแต่ละรายการด้วย SortedDictionary แม้ว่าคำตอบจะไม่สนับสนุนค่าที่ซ้ำกัน (สมมติว่า 1 ต่อ 1)
crokusek

3

สมมติว่าเรามีพจนานุกรมเป็น

   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) คุณสามารถใช้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);
        }

3

ที่จริงแล้วใน C #, พจนานุกรมอาศัยวิธีการจัดเรียง () เนื่องจากคุณสนใจเรียงลำดับตามค่ามากขึ้นคุณไม่สามารถรับค่าได้จนกว่าคุณจะให้คีย์ในระยะสั้นคุณต้องวนซ้ำโดยใช้คำสั่งของ LINQ โดย

var items = new Dictionary<string, int>();
items.Add("cat", 0);
items.Add("dog", 20);
items.Add("bear", 100);
items.Add("lion", 50);

// Call OrderBy method here on each item and provide them the ids.
foreach (var item in items.OrderBy(k => k.Key))
{
    Console.WriteLine(item);// items are in sorted order
}

คุณสามารถทำหนึ่งเคล็ดลับ

var sortedDictByOrder = items.OrderBy(v => v.Value);

หรือ

var sortedKeys = from pair in dictName
            orderby pair.Value ascending
            select pair;

มันยังขึ้นอยู่กับชนิดของค่าที่คุณเก็บ
ไว้มันเป็นโสด (เช่นสตริง, int) หรือหลาย ๆ (เช่น List, Array, class ที่ผู้ใช้กำหนด)
ถ้าคุณสามารถสร้างรายการของมันแล้วใช้การเรียงลำดับ
ถ้าผู้ใช้กำหนดคลาสคลาสนั้นจะต้องใช้ IComparable
ClassName: IComparable<ClassName>และแทนที่compareTo(ClassName c) เนื่องจากพวกเขาจะเร็วกว่า LINQ และวัตถุที่มุ่งเน้นมากขึ้น


0

เนมสเปซที่ต้องการ: using System.Linq;

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

เรียงลำดับจากมากไปน้อย:

foreach (KeyValuePair<string, int> kvp in counts.OrderByDescending(key => key.Value))
{
// some processing logic for each item if you want.
}

เรียงลำดับโดย Asc:

foreach (KeyValuePair<string, int> kvp in counts.OrderBy(key => key.Value))
{
// some processing logic for each item if you want.
}

-2

คุณสามารถจัดเรียงพจนานุกรมตามค่าและรับผลลัพธ์ในพจนานุกรมโดยใช้รหัสด้านล่าง:

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

8
โดยการวางรายการที่เรียงกลับเข้าไปในพจนานุกรมพวกเขาจะไม่รับประกันว่าจะเรียงเมื่อคุณระบุพจนานุกรมใหม่
Marty Neal

2
และทำไมคุณจึงเพิ่มคำตอบนี้เมื่อคำตอบนี้ถูกตอบแล้ว?
nawfal

-2

ให้คุณมีพจนานุกรมคุณสามารถจัดเรียงพวกเขาโดยตรงกับค่าโดยใช้ซับด้านล่าง:

var x = (from c in dict orderby c.Value.Order ascending select c).ToDictionary(c => c.Key, c=>c.Value);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.