0Pricing
C# Academy · Ders

IComparable Uygulama

CompareTo ile doğal bir sıralama düzeni tanımlayın.

IComparable Uygulama, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 3. 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.

IComparable<T> ile Sıralama

IComparable<T>, tek bir yöntem olan CompareTo aracılığıyla bir tür için doğal sıralama tanımlar. Uygulandıktan sonra türünüz Array.Sort, List.Sort ve sıralı koleksiyonlar tarafından sıralanabilir.

CompareTo Sözleşmesi

CompareTo, bu örnek diğerinden küçükse negatif bir sayı, eşitse sıfır, büyükse pozitif bir sayı döndürür. Temel alınan değerleri karşılaştırmak, bunu çoğu zaman doğrudan uygular.

using System;

public struct Weight : IComparable<Weight>
{
    public int Grams;
    public Weight(int g) { Grams = g; }

    public int CompareTo(Weight other) => Grams.CompareTo(other.Grams);

    public override string ToString() => Grams + "g";
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new Weight(100).CompareTo(new Weight(200)));
        Console.WriteLine(new Weight(200).CompareTo(new Weight(200)));
        Console.WriteLine(new Weight(300).CompareTo(new Weight(200)));
    }
}

Listeyi Sıralama

Bir tür karşılaştırılabilir olduğunda List<T>.Sort(), ek bağımsız değişkenler olmadan bu türü CompareTo kullanarak sıralar.

using System;
using System.Collections.Generic;

public struct Weight : IComparable<Weight>
{
    public int Grams;
    public Weight(int g) { Grams = g; }
    public int CompareTo(Weight other) => Grams.CompareTo(other.Grams);
    public override string ToString() => Grams + "g";
}

public class Program
{
    public static void Main()
    {
        var list = new List<Weight> { new Weight(300), new Weight(100), new Weight(200) };
        list.Sort();
        Console.WriteLine(string.Join(", ", list));
    }
}

Birincil Alana Göre Karşılaştırma

Bir sınıf için doğal sıralamasını belirleyen alanı seçin. Burada people, yaşa göre sıralanır ve int.CompareTo'a devredilir.

using System;
using System.Collections.Generic;

public class Person : IComparable<Person>
{
    public string Name;
    public int Age;
    public Person(string name, int age) { Name = name; Age = age; }
    public int CompareTo(Person other) => Age.CompareTo(other.Age);
    public override string ToString() => Name + "(" + Age + ")";
}

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

Birden Çok Alanda Eşitlik Bozma

Birincil anahtarlar eşit olduğunda ikincil bir alanı karşılaştırın. İlk karşılaştırmayı yapın ve yalnızca sonuç sıfırsa bir sonraki alana geçin.

using System;
using System.Collections.Generic;

public class Person : IComparable<Person>
{
    public string Name;
    public int Age;
    public Person(string name, int age) { Name = name; Age = age; }
    public int CompareTo(Person other)
    {
        int byAge = Age.CompareTo(other.Age);
        return byAge != 0 ? byAge : string.Compare(Name, other.Name, StringComparison.Ordinal);
    }
    public override string ToString() => Name + "(" + Age + ")";
}

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

Dizileri Sıralama

Array.Sort da IComparable<T> arabirimine dayanır. Aynı karşılaştırma mantığı dizilere, listelere ve sıralı yapılara güç verir.

using System;

public struct Score : IComparable<Score>
{
    public int Points;
    public Score(int p) { Points = p; }
    public int CompareTo(Score other) => Points.CompareTo(other.Points);
    public override string ToString() => Points.ToString();
}

public class Program
{
    public static void Main()
    {
        var scores = new[] { new Score(50), new Score(10), new Score(30) };
        Array.Sort(scores);
        Console.WriteLine(string.Join(", ", (object[])scores));
    }
}

Azalan Sıralama

Sıralamayı tersine çevirmek için CompareTo işlecinin işlenenlerini yer değiştirerek karşılaştırmayı tersine çevirin. Bu, ayrı bir karşılaştırıcı olmadan büyükten küçüğe sıralamanın temiz bir yoludur.

using System;
using System.Collections.Generic;

public struct Score : IComparable<Score>
{
    public int Points;
    public Score(int p) { Points = p; }
    // Reversed: higher points come first
    public int CompareTo(Score other) => other.Points.CompareTo(Points);
    public override string ToString() => Points.ToString();
}

public class Program
{
    public static void Main()
    {
        var list = new List<Score> { new Score(10), new Score(50), new Score(30) };
        list.Sort();
        Console.WriteLine(string.Join(", ", list));
    }
}

Karşılaştırılabilirlik ve Eşitlenebilirlik Birlikte

CompareTo sıfır döndürürse öğeler sıralama açısından eşit kabul edilir. Sıralama ile eşitliğin uyumlu olması için bunu Equals ile tutarlı tutun.

using System;

public struct Version : IComparable<Version>, IEquatable<Version>
{
    public int Major, Minor;
    public Version(int major, int minor) { Major = major; Minor = minor; }
    public int CompareTo(Version other)
    {
        int byMajor = Major.CompareTo(other.Major);
        return byMajor != 0 ? byMajor : Minor.CompareTo(other.Minor);
    }
    public bool Equals(Version other) => CompareTo(other) == 0;
    public override bool Equals(object obj) => obj is Version v && Equals(v);
    public override int GetHashCode() => HashCode.Combine(Major, Minor);
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new Version(1, 2).CompareTo(new Version(1, 5)));
        Console.WriteLine(new Version(2, 0).Equals(new Version(2, 0)));
    }
}

Karşılaştırmayı LINQ OrderBy'da Kullanma

Yerinde sıralama yapmadan bile LINQ OrderBy, anahtar seçici aracılığıyla karşılaştırılabilir türünüzü kullanarak tembel bir şekilde sıralanmış bir görünüm oluşturabilir.

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

public struct Weight : IComparable<Weight>
{
    public int Grams;
    public Weight(int g) { Grams = g; }
    public int CompareTo(Weight other) => Grams.CompareTo(other.Grams);
    public override string ToString() => Grams + "g";
}

public class Program
{
    public static void Main()
    {
        var items = new List<Weight> { new Weight(300), new Weight(100) };
        foreach (var w in items.OrderBy(x => x))
            Console.WriteLine(w);
    }
}

Sıralanabilir Bir Alan Türü

IComparable<T> uygulamak, bir alan kavramını tüm çatının sıralayabileceği bir yapıya dönüştürür. Burada tasks önce önceliğe, ardından ada göre sıralanır.

using System;
using System.Collections.Generic;

public class TaskItem : IComparable<TaskItem>
{
    public string Name;
    public int Priority;
    public TaskItem(string name, int priority) { Name = name; Priority = priority; }
    public int CompareTo(TaskItem other)
    {
        int byPriority = Priority.CompareTo(other.Priority);
        return byPriority != 0 ? byPriority : string.Compare(Name, other.Name, StringComparison.Ordinal);
    }
    public override string ToString() => Priority + ":" + Name;
}

public class Program
{
    public static void Main()
    {
        var tasks = new List<TaskItem>
        {
            new TaskItem("deploy", 2), new TaskItem("build", 1), new TaskItem("test", 1)
        };
        tasks.Sort();
        Console.WriteLine(string.Join(", ", tasks));
    }
}

Kendiniz Deneyin

Birden çok alanı karşılaştırılabilen bir tür oluşturun ve bundan oluşan bir listeyi sıralayın. Ek bağımsız değişkenler olmadan doğal sıralama CompareTo üzerinden ortaya çıkar.

using System;
using System.Collections.Generic;

public class Card : IComparable<Card>
{
    public int Rank;
    public string Suit;
    public Card(int rank, string suit) { Rank = rank; Suit = suit; }
    public int CompareTo(Card other)
    {
        int byRank = Rank.CompareTo(other.Rank);
        return byRank != 0 ? byRank : string.Compare(Suit, other.Suit, StringComparison.Ordinal);
    }
    public override string ToString() => Rank + Suit;
}

public class Program
{
    public static void Main()
    {
        var hand = new List<Card>
        {
            new Card(10, "H"), new Card(2, "S"), new Card(10, "C")
        };
        hand.Sort();
        Console.WriteLine(string.Join(", ", hand));
    }
}

Hızlı Kontrol

CompareTo sözleşmesini hatırlayın.

Özet

IComparable<T>, CompareTo aracılığıyla doğal bir sıralama tanımlar.

  • Negatif, sıfır ve pozitif değerler; küçük, eşit ve büyük anlamına gelir.
  • List.Sort, Array.Sort ve sıralı koleksiyonları kullanılabilir hâle getirir.
  • Eşitlik durumunda ikincil alanları karşılaştırarak ayrım yapın.
  • CompareTo == 0 sonucunu Equals ile tutarlı tutun.

Sıkça Sorulan Sorular

“IComparable Uygulama” dersi ücretsiz mi?

Evet — “IComparable Uygulama” 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.

“IComparable Uygulama” dersinde ne öğreneceğim?

CompareTo ile doğal bir sıralama düzeni tanımlayı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 3. dersidir.

“IComparable Uygulama” 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