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 elementAdd 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 3Alt 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 sameDizinleme 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
- Uygulamada Liste
- Sözlük Aramaları
- HashSet ve Benzersizlik
- Koleksiyon Seçme