0Pricing
C# Academy · Ders

Özel Sıralama için IComparer

Karşılaştırıcılarla alternatif sıralama düzenleri sağlayın.

Özel Sıralama için IComparer, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.

Farklı Biçimlerde Sıralama

Bir türün IComparable<T> aracılığıyla yalnızca bir doğal sıralaması vardır. Aynı verileri başka biçimlerde sıralamak için çağrı noktasında bir IComparer<T> veya Comparison<T> temsilcisi sağlayın.

IComparer<T> Uygulama

IComparer<T>, Compare(x, y) yöntemine sahip ayrı bir nesnedir. CompareTo ile aynı negatif, sıfır ve pozitif sözleşmesini izler.

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));
    }
}

Tek Bir Tür İçin Birden Çok Karşılaştırıcı

Birkaç karşılaştırıcı tanımlayabilir ve her sıralama için birini seçebilirsiniz. Burada aynı people gerektiğinde ada veya yaşa göre sıralanabilir.

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));
    }
}

Comparison<T> Temsilcisi

Tek seferlik sıralamalarda, bir Comparison<T> temsilcisi (çoğunlukla bir lambda) başlı başına bir sınıftan daha özlüdür. List.Sort bunu doğrudan kabul eder.

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));
    }
}

Karşılaştırıcıyla Azalan Sıralama

Compare içindeki işlenenlerin yerlerini değiştirerek sıralama yönünü tersine çevirin. Böylece türün kendisini değiştirmeden azalan sıralama elde edersiniz.

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));
    }
}

OrderBy İçinde Karşılaştırıcılar

LINQ OrderBy, ikinci bağımsız değişken olarak bir IComparer<TKey> kabul eder ve seçilen anahtarların karşılaştırılma biçimini özelleştirmenizi sağlar.

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);
    }
}

Birden Çok Anahtarla Karşılaştırma

Bir karşılaştırıcı, öncelik sırasına göre birden çok anahtarla sıralama yapabilir. İlk anahtarı hesaplayın; eşitlik varsa sonraki anahtara geçin.

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));
    }
}

Comparer.Create Kısa Yolu

Comparer<T>.Create, bir lambda'dan IComparer<T> oluşturur; böylece temsilcinin özlülüğünü, karşılaştırıcı gerektiren arayüz API'leriyle birleştirir.

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));
    }
}

Karşılaştırıcıları Koleksiyonlar Arasında Yeniden Kullanma

Tek bir karşılaştırıcı örneği sıralama, arama ve sıralı kümeleri yönetebilir. Karşılaştırıcıyı bir kez tanımlamak, kullanıldığı her yerde sıralama kurallarını tutarlı kılar.

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));
    }
}

IComparable ile IComparer Arasında Seçim Yapma

Türe yerleşik tek doğal sıralama için IComparable<T> kullanın. Çağrı noktasında belirlediğiniz çok sayıdaki alternatif ve bağlama özgü sıralama için IComparer<T> veya Comparison<T> kullanın.

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));
    }
}

Kendiniz Deneyin

Öğe türüne dokunmadan, karşılaştırıcıları ve bir lambdayı kullanarak tek bir listeyi üç farklı biçimde sıralayın.

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));
    }
}

Hızlı Kontrol

Doğru sıralama soyutlamasını seçin.

Özet

Özel sıralama, çağrı noktasında sağlanan karşılaştırıcıları kullanır.

  • IComparer<T>, negatif, sıfır ve pozitif sözleşmesiyle Compare(x, y) yöntemini uygular.
  • Comparison<T> temsilcileri ve lambdalar tek seferlik sıralamalar için uygundur.
  • Comparer<T>.Create, lambdaları arayüze bağlar.
  • Doğal sıralama için IComparable, alternatifler için karşılaştırıcıları kullanın.

Sıkça Sorulan Sorular

“Özel Sıralama için IComparer” dersi ücretsiz mi?

Evet — “Özel Sıralama için IComparer” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.

“Özel Sıralama için IComparer” dersinde ne öğreneceğim?

Karşılaştırıcılarla alternatif sıralama düzenleri sağlayın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C# Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Özel Sıralama için IComparer” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. IEquatable Uygulama
  2. GetHashCode'u Geçersiz Kılma
  3. IComparable Uygulama
  4. Özel Sıralama için IComparer
← C# Academy Sayfasına Dön