0Pricing
C# Academy · Ders

HashSet ve Benzersizlik

Farklı değerleri izleyin.

HashSet ve Benzersizlik, 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.

HashSet Nedir?

HashSet<T>, yinelenen değerler içermeyen bir benzersiz değerler koleksiyonu saklar. Zaten mevcut olan bir değeri eklemek hiçbir şey yapmaz.

Sözlük gibi karma tablosuyla desteklenir; bu nedenle üyelik denetimleri ortalama O(1) maliyetindedir. Ekleme sırasını korumaz.

using System.Collections.Generic;

var seen = new HashSet<int>();
seen.Add(1);
seen.Add(1); // ignored, still one element

Add Boole Değeri Döndürür

Add, değer yeniyse true, zaten mevcutsa false döndürür.

Bu dönüş değeri, ayrı bir Contains denetimi yapmadan yinelenenleri tek adımda algılamak için kullanışlıdır.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var set = new HashSet<string>();
        Console.WriteLine(set.Add("a")); // True
        Console.WriteLine(set.Add("a")); // False
    }
}

Hızlı Üyelik Denetimleri

Bir HashSet üzerinde Contains işlemi ortalama O(1) maliyetindedir; List üzerinde ise O(n) maliyetindedir.

Bir değeri tekrar tekrar "Bunu gördüm mü?" diye denetliyorsanız küme doğru araçtır. Koleksiyon büyüdükçe hız farkı büyük ölçüde artar.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var ids = new HashSet<int> { 10, 20, 30 };
        Console.WriteLine(ids.Contains(20)); // True
        Console.WriteLine(ids.Contains(99)); // False
    }
}

Listedeki Yinelenenleri Kaldırma

Yaygın bir görev, bir listeyi alıp yalnızca birbirinden farklı değerleri korumaktır. Listeden bir HashSet oluşturmak bunu O(n) maliyetle yapar.

Ortaya çıkan kümede her değer bir kez bulunur. Yeniden bir listeye ihtiyacınız varsa onu şu şekilde sarmalayın: new List<int>(set).

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 1, 2, 2, 3, 3, 3 };
        var unique = new HashSet<int>(nums);
        Console.WriteLine(unique.Count); // 3
    }
}

Birleşim

UnionWith, başka bir koleksiyondaki her öğeyi yinelenenleri atlayarak ekler. Sonuç, her iki koleksiyondaki tüm öğeleri içerir.

Bu işlem kümeyi yerinde değiştirir. Her öğe için kendiniz döngü kurup Add çağırmaktan çok daha temizdir.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var a = new HashSet<int> { 1, 2, 3 };
        a.UnionWith(new[] { 3, 4, 5 });
        Console.WriteLine(a.Count); // 5
    }
}

Kesişim

IntersectWith, yalnızca diğer koleksiyonda da bulunan öğeleri korur ve geri kalanları kaldırır.

İki makalenin paylaştığı etiketleri veya iki grubun ikisinde de bulunan kullanıcıları bulmak gibi ortak öğeleri belirlemek için kullanın.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var a = new HashSet<int> { 1, 2, 3, 4 };
        a.IntersectWith(new[] { 2, 4, 6 });
        Console.WriteLine(string.Join(",", a)); // 2,4
    }
}

Fark

ExceptWith, diğer koleksiyonda bulunan tüm öğeleri kümeden kaldırır ve kümeye özgü olanları bırakır.

Bu, küme farkı işlemidir: "A'da olup B'de olmayan öğeler". Değişenleri veya işlenmeyi bekleyenleri hesaplamak için çok kullanışlıdır.

var a = new HashSet<int> { 1, 2, 3, 4 };
a.ExceptWith(new[] { 2, 4 });
// a now contains 1 and 3

Alt Küme ve Üst Küme

IsSubsetOf ve IsSupersetOf, kümeler arasındaki kapsama ilişkilerini denetleyerek bir bool döndürür.

Overlaps herhangi bir öğenin ortak olup olmadığını denetler; SetEquals ise iki kümenin, sıraları ne olursa olsun, tamamen aynı öğeleri içerip içermediğini denetler.

var a = new HashSet<int> { 1, 2 };
var b = new HashSet<int> { 1, 2, 3 };
bool sub = a.IsSubsetOf(b);   // true
bool ov = a.Overlaps(b);      // true

Öğe Eşitliği

Benzersizlik, tıpkı sözlük anahtarlarında olduğu gibi, öğe türünün GetHashCode ve Equals üyelerine bağlıdır.

Özel türlerde her ikisini de geçersiz kılın veya bir record kullanın; aksi takdirde mantıksal olarak eşit iki nesne farklı kabul edilir ve ikisi de kümeye eklenir.

var names = new HashSet<string>(
    System.StringComparer.OrdinalIgnoreCase);
names.Add("Sam");
bool dup = !names.Add("SAM"); // true: treated as same

Dizinleme veya Sıra Yok

Bir HashSet dizin erişimine sahip değildir; set[0] yazamazsınız. Onu yalnızca foreach ile numaralandırabilirsiniz.

Numaralandırma sırası garanti edilmez. Hem benzersizlik hem de sıralı düzen gerekiyorsa, öğeleri sıralı tutan ancak işlemleri O(log n) maliyetine çıkaran SortedSet<T> kullanın.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var s = new SortedSet<int> { 3, 1, 2 };
        Console.WriteLine(string.Join(",", s)); // 1,2,3
    }
}

Görülen Öğeleri İzleme

Sık kullanılan bir örüntü, bir akışı her değer yalnızca bir kez görünecek şekilde süzmektir. Bir kümeye ekleme yapın ve yalnızca Add true döndürdüğünde işlem yapın.

Bu yöntem, büyüyen bir listeyi denetlemekten daha temiz ve hızlıdır; O(n kare) maliyetli bir taramayı O(n) maliyetine dönüştürür.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var seen = new HashSet<int>();
        foreach (int x in new[] { 1, 1, 2, 3, 2 })
            if (seen.Add(x)) Console.Write(x + " ");
        // prints 1 2 3
    }
}

Hızlı Kontrol

HashSet'in hangi kuralları zorunlu kıldığını ve arama maliyetini hatırlayın.

Özet

HashSet<T>, ekleme, kaldırma ve üyelik denetimlerini ortalama O(1) maliyetle gerçekleştirerek benzersiz değerleri saklar; ancak sıralama veya dizinleme sunmaz.

Yinelenenleri kaldırma, hızlı "Bunu gördüm mü?" denetimleri ve UnionWith, IntersectWith ile ExceptWith aracılığıyla küme cebiri için özellikle uygundur. Özel öğe türlerinin uygun eşitliği uygulaması gerekir.

Sıkça Sorulan Sorular

“HashSet ve Benzersizlik” dersi ücretsiz mi?

Evet — “HashSet ve Benzersizlik” 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.

“HashSet ve Benzersizlik” dersinde ne öğreneceğim?

Farklı değerleri izleyin. 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.

“HashSet ve Benzersizlik” 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. Uygulamada Liste
  2. Sözlük Aramaları
  3. HashSet ve Benzersizlik
  4. Koleksiyon Seçme
← C# Academy Sayfasına Dön