Ö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şmesiyleCompare(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
- IEquatable Uygulama
- GetHashCode'u Geçersiz Kılma
- IComparable Uygulama
- Özel Sıralama için IComparer