Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

การเรียงลำดับ KeyValuePair ใน C# ด้วยเมธอด Sort()

คลาส 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() หรือ implement IComparer<T>