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

วิธีจัดเรียงอาร์เรย์แบบ Descending (มากไปน้อย) ใน C#

ภาพรวม

ใน C# ไม่มีเมธอด SortDescending ตรงๆ แต่สามารถจัดเรียงจากมากไปน้อยได้โดย:

  1. เรียงจากน้อยไปมากด้วย Array.Sort()
  2. กลับลำดับด้วย Array.Reverse()

ตัวอย่างโปรแกรม

using System;

namespace Demo
{
    public class MyApplication
    {
        public static void Main(string[] args)
        {
            int[] list = { 98, 23, 97, 36, 77 };
            
            Console.WriteLine("Original Unsorted List");
            foreach (int i in list)
                Console.Write(i + " ");
            
            // 1. เรียงน้อยไปมาก
            Array.Sort(list);
            
            // 2. กลับลำดับ = มากไปน้อย
            Array.Reverse(list);
            
            Console.WriteLine("\nSorted List (Descending)");
            for (int i = 0; i < list.Length; i++)
                Console.Write(list[i] + " ");
        }
    }
}

ผลลัพธ์

Original Unsorted List
98 23 97 36 77
Sorted List (Descending)
98 97 77 36 23

วิธีอื่นๆ ในการจัดเรียง Descending

1. ใช้ LINQ OrderByDescending (ไม่เปลี่ยนอาร์เรย์เดิม)

using System.Linq;

int[] list = { 98, 23, 97, 36, 77 };
int[] sorted = list.OrderByDescending(x => x).ToArray();
// sorted = [98, 97, 77, 36, 23]
// list ยังคงเป็น [98, 23, 97, 36, 77]

2. ใช้ Comparison Delegate กับ Array.Sort

Array.Sort(list, (a, b) => b.CompareTo(a)); // Descending
// หรือ
Array.Sort(list, Comparer.Create((a, b) => b - a));

3. ใช้ IComparer Custom Class

public class DescendingComparer : IComparer
{
    public int Compare(int x, int y) => y.CompareTo(x);
}

// ใช้งาน
Array.Sort(list, new DescendingComparer());

4. สำหรับ List<T>

List list = new List { 98, 23, 97, 36, 77 };
list.Sort();        // Ascending
list.Reverse();     // Descending

// หรือ
list.Sort((a, b) => b.CompareTo(a)); // Descending โดยตรง

ตัวอย่างกับ String Array

string[] names = { "Charlie", "Alice", "Bob", "David" };

Array.Sort(names);       // Alphabetical: Alice, Bob, Charlie, David
Array.Reverse(names);    // Reverse: David, Charlie, Bob, Alice

// หรือ Descending โดยตรง
Array.Sort(names, (a, b) => string.Compare(b, a));
// David, Charlie, Bob, Alice

ข้อสังเกตสำคัญ

  • Array.Sort + Array.Reverse เร็วที่สุดและ Memory Efficient (In-place)
  • Array.Reverse เป็น O(n) เพิ่มเติม - รวม O(n log n) + O(n) ≈ O(n log n)
  • LINQ OrderByDescending สร้างอาร์เรย์ใหม่ (O(n) Space) - ใช้เมื่อต้องการเก็บต้นฉบับไว้
  • สำหรับ Custom Type ต้อง Implement IComparable<T> หรือส่ง IComparer<T>
  • Sort เป็น Unstable (ยกเว้นการใช้ LINQ OrderBy ที่ Stable)