คลาส List<KeyValuePair<TKey, TValue>> มีเมธอด Sort() ที่รับ delegate การเปรียบเทียบ (Comparison delegate) เพื่อเรียงลำดับคู่คีย์-ค่า ตามเกณฑ์ที่กำหนด
รูปแบบการใช้งาน
list.Sort((x, y) => x.Value.CompareTo(y.Value)); // เรียงตาม Value น้อยไปมาก
list.Sort((x, y) => y.Value.CompareTo(x.Value)); // เรียงตาม Value มากไปน้อย
list.Sort((x, y) => x.Key.CompareTo(y.Key)); // เรียงตาม Key
โค้ดตัวอย่างสมบูรณ์
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var myList = new List>();
// เพิ่มข้อมูล
myList.Add(new KeyValuePair(1, 20));
myList.Add(new KeyValuePair(2, 15));
myList.Add(new KeyValuePair(3, 35));
myList.Add(new KeyValuePair(4, 50));
myList.Add(new KeyValuePair(5, 25));
Console.WriteLine("ก่อนเรียงลำดับ:");
foreach (var kvp in myList)
Console.WriteLine($" [{kvp.Key}, {kvp.Value}]");
// เรียงตาม Value จากมากไปน้อย (Descending)
myList.Sort((x, y) => y.Value.CompareTo(x.Value));
Console.WriteLine("\nหลังเรียงตาม Value (มาก → น้อย):");
foreach (var kvp in myList)
Console.WriteLine($" [{kvp.Key}, {kvp.Value}]");
// เรียงตาม Key จากน้อยไปมาก (Ascending)
myList.Sort((x, y) => x.Key.CompareTo(y.Key));
Console.WriteLine("\nหลังเรียงตาม Key (น้อย → มาก):");
foreach (var kvp in myList)
Console.WriteLine($" [{kvp.Key}, {kvp.Value}]");
}
}
ผลลัพธ์
ก่อนเรียงลำดับ:
[1, 20]
[2, 15]
[3, 35]
[4, 50]
[5, 25]
หลังเรียงตาม Value (มาก → น้อย):
[4, 50]
[3, 35]
[5, 25]
[1, 20]
[2, 15]
หลังเรียงตาม Key (น้อย → มาก):
[1, 20]
[2, 15]
[3, 35]
[4, 50]
[5, 25]
การใช้ LINQ แทน (ไม่เปลี่ยนลิสต์เดิม)
using System.Linq;
// เรียงตาม Value มากไปน้อย - คืนลิสต์ใหม่
var sortedDesc = myList.OrderByDescending(kvp => kvp.Value).ToList();
// เรียงตาม Key น้อยไปมาก
var sortedAsc = myList.OrderBy(kvp => kvp.Key).ToList();
// เรียงหลายระดับ: Value มากไปน้อย แล้ว Key น้อยไปมาก
var multiSort = myList
.OrderByDescending(kvp => kvp.Value)
.ThenBy(kvp => kvp.Key)
.ToList();
การเรียงลำดับ Dictionary โดยตรง
var dict = new Dictionary
{
{ "Apple", 50 }, { "Banana", 20 }, { "Cherry", 35 }
};
// เรียงตาม Value แล้วสร้าง Dictionary ใหม่ (ต้องใช้ .NET 6+ สำหรับการรักษาลำดับ)
var sortedDict = dict.OrderByDescending(kvp => kvp.Value)
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
หมายเหตุสำคัญ
List.Sort()เรียงลำดับ แบบ In-place (เปลี่ยนลิสต์เดิม)LINQ OrderBy()คืนลำดับใหม่ ไม่เปลี่ยน ลิสต์เดิมKeyValuePairเป็น struct - การเรียงลำดับมีค่าใช้จ่ายต่ำ- สำหรับชนิดข้อมูลที่ซับซ้อน ใช้
Comparer<T>.Create()หรือ implementIComparer<T>