0Pricing
C# Academy · Pelajaran

IComparer untuk Pengurutan Kustom

Sediakan urutan alternatif dengan pembanding.

IComparer untuk Pengurutan Kustom adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Mengurutkan dengan Berbagai Cara

Sebuah tipe hanya memiliki satu urutan alami melalui IComparable<T>. Untuk mengurutkan data yang sama dengan cara lain, berikan IComparer<T> atau delegasi Comparison<T> di lokasi pemanggilan.

Mengimplementasikan IComparer<T>

IComparer<T> adalah objek terpisah dengan metode Compare(x, y). Objek ini mengikuti kontrak negatif/nol/positif yang sama seperti CompareTo.

using System;
using System.Collections.Generic;

public class Person
{
    public string Name;
    public int Age;
    public Person(string name, int age) { Name = name; Age = age; }
    public override string ToString() => Name + "(" + Age + ")";
}

public class ByName : IComparer<Person>
{
    public int Compare(Person x, Person y)
        => string.Compare(x.Name, y.Name, StringComparison.Ordinal);
}

public class Program
{
    public static void Main()
    {
        var people = new List<Person> { new Person("Zoe", 1), new Person("Ann", 2) };
        people.Sort(new ByName());
        Console.WriteLine(string.Join(", ", people));
    }
}

Beberapa Pembanding untuk Satu Tipe

Anda dapat menentukan beberapa pembanding dan memilih salah satunya untuk setiap pengurutan. Di sini, people yang sama dapat diurutkan berdasarkan nama atau usia sesuai kebutuhan.

using System;
using System.Collections.Generic;

public class Person
{
    public string Name;
    public int Age;
    public Person(string name, int age) { Name = name; Age = age; }
    public override string ToString() => Name + "(" + Age + ")";
}

public class ByAge : IComparer<Person>
{
    public int Compare(Person x, Person y) => x.Age.CompareTo(y.Age);
}

public class Program
{
    public static void Main()
    {
        var people = new List<Person> { new Person("Ann", 40), new Person("Bo", 20) };
        people.Sort(new ByAge());
        Console.WriteLine(string.Join(", ", people));
    }
}

Delegasi Comparison<T>

Untuk pengurutan sekali pakai, delegasi Comparison<T> (sering kali berupa ekspresi lambda) lebih ringkas daripada seluruh kelas. List.Sort menerimanya secara langsung.

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var words = new List<string> { "banana", "fig", "apple" };
        // Sort by length using a Comparison<string> lambda
        words.Sort((a, b) => a.Length.CompareTo(b.Length));
        Console.WriteLine(string.Join(", ", words));
    }
}

Urutan Menurun dengan Pembanding

Balik urutan dengan menukar operand di dalam Compare. Dengan begitu, Anda mendapatkan pengurutan menurun tanpa mengubah tipe itu sendiri.

using System;
using System.Collections.Generic;

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

public class Program
{
    public static void Main()
    {
        var nums = new List<int> { 3, 1, 4, 1, 5 };
        nums.Sort(new DescendingInt());
        Console.WriteLine(string.Join(", ", nums));
    }
}

Pembanding dalam OrderBy

LINQ OrderBy menerima IComparer<TKey> sebagai argumen kedua, sehingga Anda dapat menyesuaikan cara kunci yang dipilih dibandingkan.

using System;
using System.Collections.Generic;
using System.Linq;

public class CaseInsensitive : IComparer<string>
{
    public int Compare(string x, string y)
        => string.Compare(x, y, StringComparison.OrdinalIgnoreCase);
}

public class Program
{
    public static void Main()
    {
        var names = new[] { "bob", "Alice", "carol" };
        foreach (var n in names.OrderBy(x => x, new CaseInsensitive()))
            Console.WriteLine(n);
    }
}

Perbandingan dengan Beberapa Kunci

Pembanding dapat mengurutkan berdasarkan beberapa kunci sesuai urutan prioritas. Hitung kunci pertama; jika nilainya sama, lanjutkan ke kunci berikutnya.

using System;
using System.Collections.Generic;

public class Employee
{
    public string Dept;
    public int Salary;
    public Employee(string dept, int salary) { Dept = dept; Salary = salary; }
    public override string ToString() => Dept + ":" + Salary;
}

public class ByDeptThenSalary : IComparer<Employee>
{
    public int Compare(Employee x, Employee y)
    {
        int byDept = string.Compare(x.Dept, y.Dept, StringComparison.Ordinal);
        return byDept != 0 ? byDept : x.Salary.CompareTo(y.Salary);
    }
}

public class Program
{
    public static void Main()
    {
        var staff = new List<Employee>
        {
            new Employee("IT", 50), new Employee("HR", 40), new Employee("IT", 30)
        };
        staff.Sort(new ByDeptThenSalary());
        Console.WriteLine(string.Join(", ", staff));
    }
}

Pintasan Comparer.Create

Comparer<T>.Create membuat IComparer<T> dari lambda, menggabungkan keringkasan delegasi dengan API antarmuka yang memerlukan pembanding.

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var byLengthDesc = Comparer<string>.Create((a, b) => b.Length.CompareTo(a.Length));
        var words = new List<string> { "hi", "hello", "hey" };
        words.Sort(byLengthDesc);
        Console.WriteLine(string.Join(", ", words));
    }
}

Menggunakan Kembali Pembanding di Berbagai Koleksi

Satu instans pembanding dapat menggerakkan pengurutan, pencarian, dan set terurut. Mendefinisikannya sekali menjaga aturan pengurutan tetap konsisten di mana pun aturan itu digunakan.

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        IComparer<int> desc = Comparer<int>.Create((a, b) => b.CompareTo(a));
        var set = new SortedSet<int>(desc) { 1, 5, 3 };
        Console.WriteLine(string.Join(", ", set));
    }
}

Memilih IComparable atau IComparer

Gunakan IComparable<T> untuk satu urutan alami yang tertanam dalam tipe. Gunakan IComparer<T> atau Comparison<T> untuk berbagai urutan alternatif yang bergantung pada konteks dan ditentukan di lokasi pemanggilan.

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var nums = new List<int> { 5, 2, 8, 1 };
        nums.Sort(); // natural ascending (int is IComparable)
        Console.WriteLine(string.Join(", ", nums));
        nums.Sort((a, b) => b - a); // custom descending via delegate
        Console.WriteLine(string.Join(", ", nums));
    }
}

Coba Sendiri

Urutkan satu daftar dengan tiga cara berbeda menggunakan pembanding dan lambda, semuanya tanpa menyentuh tipe elemennya.

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var words = new List<string> { "pear", "fig", "apple", "kiwi" };

        words.Sort(); // natural alphabetical
        Console.WriteLine(string.Join(", ", words));

        words.Sort((a, b) => a.Length.CompareTo(b.Length)); // by length
        Console.WriteLine(string.Join(", ", words));

        words.Sort(Comparer<string>.Create((a, b) => b.CompareTo(a))); // reverse alphabetical
        Console.WriteLine(string.Join(", ", words));
    }
}

Pemeriksaan Singkat

Pilih abstraksi pengurutan yang tepat.

Ringkasan

Pengurutan khusus menggunakan pembanding yang diberikan di lokasi pemanggilan.

  • IComparer<T> mengimplementasikan Compare(x, y) dengan kontrak negatif/nol/positif.
  • Delegasi Comparison<T> dan lambda cocok untuk pengurutan sekali pakai.
  • Comparer<T>.Create menjembatani lambda dengan antarmuka.
  • Gunakan IComparable untuk urutan alami dan pembanding untuk urutan alternatif.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “IComparer untuk Pengurutan Kustom” gratis?

Ya — teks lengkap “IComparer untuk Pengurutan Kustom” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “IComparer untuk Pengurutan Kustom”?

Sediakan urutan alternatif dengan pembanding. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “IComparer untuk Pengurutan Kustom” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengimplementasikan IEquatable
  2. Mengganti GetHashCode
  3. Mengimplementasikan IComparable
  4. IComparer untuk Pengurutan Kustom
← Kembali ke C# Academy