Koleksiyonlar (Collections)
Bazı Başlıklar Koleksiyon arayüzleri ve türler Listeler (List) Kuyruklar (Queues) Yığınlar (Stacks) Bağlı Listeler (Linked Lists) Sıralı Listeler (Sorted Lists) Sözlükler (Dictionaries) Lookups HashSets BitArrays Performans
Collection Interfaces and Types Koleksiyon sınıflarını 2 kategoride toplamak mümkündür: Object türünde elemanlar depolayabilen kolleksiyonlar (System.Collection namespace) Şablon koleksiyon sınıfları.clr 2.0 dan önce mümkün değildi. (System.Collection.Generic)
Özel bir tür için geliştirilmiş olan koleksiyon sınıfları Collections.Specialized namespace inde bulunmaktadır.
Listeler (Lists) Dinamik listeler için,.net Framework, ArrayList ve List<T> sınıflarını kullanıma sunmuştur.
Liste Oluşturmak Liste nesnelerini varsayılan yapıcıları invoke edilerek oluşturulabilir. İlk etapta varsayılan yapıcıyı kullanarak boş bir liste oluşturulur. Elemanlar listeye eklendikçe kapasite, 4 elemana yetecek kadar artar. 5. eleman eklendiğinde ise, boyut 2 katına çıkarak 8 eleman saklayabilir hale gelir. Sınırı aşan her ekleme kapasiteyi 2 ye katlar.
class Program static void Main(string[] args) ArrayList objectlist = new ArrayList(); List<int> intlist = new List<int>(); List<Racer> racers = new List<Racer>(); ArrayList objectlist 2= new ArrayList(10); List<int> intlist2 = new List<int>(25);
İlk Değer Atama class Program static void Main(string[] args) List<int> intlist = new List<int>() 1, 2 ; List<string> stringlist = new List<string>() "bir", "iki", "üç" ;
Eleman Ekleme class Program static void Main(string[] args) List<int> intlist = new List<int>(); intlist.add(1); intlist.add(2); List<string> stringlist = new List<string>(); stringlist.add("bir"); stringlist.add("iki");
class Program static void Main(string[] args) Racer graham = new Racer("Graham", "Hill", "UK", 14); Racer emerson = new Racer("Emerson", "Fittipaldi", "Brazil", 14); Racer mario = new Racer("Mario", "Andretti", "USA", 12); List<Racer> racers = new List<Racer> (20) graham, emerson, mario ; racers.add(new Racer("Michael", "Schumacher", "Germany", 91)); racers.add(new Racer("Mika", "Hakkinen", "Finland", 20));
AddRange class Program static void Main(string[] args) List<Racer> racers = new List<Racer> (20); racers.addrange(new Racer[] new Racer("Niki","Lauda","Autria",25), new Racer("Ayrton","Senna","Brazil",41));
AddRange() metodu IEnumerable<T> türünden nesneleri kabul etmektedir. Bu yüzdendir ki az önce yazdığımız kod parçası geçerlidir.
Eleman Ekleme Insert() metodu ile belirli bir pozisyona eleman eklemek mümkündür.
class Program static void Main(string[] args) Racer graham = new Racer("Graham", "Hill", "UK", 14); Racer emerson = new Racer("Emerson", "Fittipaldi", "Brazil", 14); Racer mario = new Racer("Mario", "Andretti", "USA", 12); List<Racer> racers = new List<Racer> (20) graham, emerson, mario ; racers.add(new Racer("Michael", "Schumacher", "Germany", 91)); racers.add(new Racer("Mika", "Hakkinen", "Finland", 20)); racers.insert(3, new Racer("Phil", "Hill", "USA", 3));
Elemanlara Ulaşma IList ve IList<T> arayüzlerini implement eden tüm sınıflar bir indeksi de beraberinde kullanıyordur. Böylece bu sınıfların elemanlarına indeks kullanarak ulaşmak mümkün olur.
class Program static void Main(string[] args) Racer graham = new Racer("Graham", "Hill", "UK", 14); Racer emerson = new Racer("Emerson", "Fittipaldi", "Brazil", 14); Racer mario = new Racer("Mario", "Andretti", "USA", 12); Racer r1 = racers[3]; for (int i = 0; i < racers.count; i++) Console.WriteLine(racers[i].ToString());
Indeks kullanarak ArrayList, StringCollection ve List<T> koleksiyon sınıflarının elemanlarına erişmek mümkündür.
List<T> sınıfı, IEnumerable arayüzünü implement ettiğinden, koleksiyonun elemanları üzerinde foreach kullanılarak dolaşmak mümkündür.
class Program static void Main(string[] args) Racer graham = new Racer("Graham", "Hill", "UK", 14); Racer emerson = new Racer("Emerson", "Fittipaldi", "Brazil", 14); Racer mario = new Racer("Mario", "Andretti", "USA", 12); Racer r1 = racers[3]; foreach (Racer r in racers) Console.WriteLine(r.ToString());
Eleman Silme Koleksiyondan indeks numarası kullanılarak eleman silmek mümkündür. İndeksını kullanmadan Remove() metodu ile de silme gerçekleştirilir. Fakat bu durumda koleksiyon üzerinde arama yapılacak ve silinmek istenen elmanın indeksi bulunacak (IndexOf metodu ile) ve bunun silinmek istenen eleman olup olmadığı test edilcektir.
class Program static void Main(string[] args) Racer graham = new Racer("Graham", "Hill", "UK", 14); Racer emerson = new Racer("Emerson", "Fittipaldi", "Brazil", 14); Racer mario = new Racer("Mario", "Andretti", "USA", 12); Racer r1 = racers[3]; racers.removeat(3); foreach (Racer r in racers) Console.WriteLine(r.ToString());
class Program static void Main(string[] args) Racer graham = new Racer("Graham", "Hill", "UK", 14); Racer emerson = new Racer("Emerson", "Fittipaldi", "Brazil", 14); Racer mario = new Racer("Mario", "Andretti", "USA", 12); Racer r1 = racers[3]; int indextostartdelete=3; int count=5; racers.removerange(indextostartdelete, count); foreach (Racer r in racers) Console.WriteLine(r.ToString());
Arama (Searching) Koleksiyon üzerinde arama yapmanın pek çok farklı yolu mevcuttur. Aranan elemanın indeksi veya kendisi elde edilebilir.
IndexOf(), LastIndexOf(), FindIndex(), FindLastIndex(), Find(), FindLast() gibi metotlar kullanılabilir. List<T> sınıfının Exists() metodu da kullanılabilir.
IndexOf () IndexOf() metodu parametre olarak bir nesneye ihtiyaç duyar ve geriye bu nesnenin koleksiyon içerisindeki indeks numarasını döndürür. Eğer eleman koleksiyon içinde bulunmuyorsa -1 değerini döndürür.
class Program static void Main(string[] args) Racer graham = new Racer("Graham", "Hill", "UK", 14); Racer emerson = new Racer("Emerson", "Fittipaldi", "Brazil", 14); Racer mario = new Racer("Mario", "Andretti", "USA", 12); Racer r1 = racers[3]; int index1 = racers.indexof(mario); Console.WriteLine(index1.ToString());
Sıralama (Sorting) List<T> sınıfı, Sort() metodu kullanarak sırlama işlemini sağlar. Sort() metodu arka planda quicksort algoritması ile sıralama gerçekleştirir. Sort() metodunun pek çok farklı overload u bulunmaktadır.
public void List<T>.Sort(); public void List<T>.Sort(Comparison<T>); public void List<T>.Sort(Icomparer<T>); public void List<T>.Sort(Int32, Int32, IComparer<T> Sort() metodunun pek çok farklı overload u bulunmaktadır. Eğer, koleksiyon IComparable<T> arayüzünü implement ediyorsa, herhangi bir parametre almadan da çağrılabilir.
Kuyruklar (Queues) Kuyruk, FIFO (First In, First Out) prensibine göre çalışmaktadır. Queue ve Queue<T> olmak üzere 2 farklı versiyonu mevcuttur. Queue<T> şablon kuyruk koleksiyonu, List<T> koleksiyonuna oldukça benzemektedir. Her iki veri yapısı da ICollection ve IEnumerable arayüzlerini implement ederler.
Koleksiyonun elemanlarına IList de olduğu gibi herhangi bir indeks kullanılarak erişmek mümkün değildir. Kuyruğa bir eleman eklenebilir(enqueue) veya çıkartılabilir (Dequeue).
Queue Koleksiyonuna ait Bazı Metotlar
Yığınlar (Stacks) Yığın, LIFO(Last in, first out) prensibine göre çalışmaktadır.
Stack Koleksiyonuna ait Bazı Metotlar
Yığın üzerindeki elemanları numaralandırıcı kullanarak okumak elemanların durumunu değiştirmez.
class Program static void Main(string[] args) Stack<char> alphabet = new Stack<char>(); alphabet.push( A ); alphabet.push( B ); alphabet.push( C ); foreach(char item in alphabet) Console.Write(item);
Bağlı Listeler (Linked Lists) Sadece şablon versiyonu olan koleksiyon türü LinkedList<T> dir. Bu koleksiyon doubly linked listedir.
Bu koleksiyonda, eğer elemanlar listenin ortasına eklenmesi işlemi oldukça hızlıdır. Böyle bir durumda, önceki elemanın Next referansı ve bir sonraki elemanın Previous referansı yeni eklenen elemanı gösterecek şekilde güncellenmektedir. List<T> ve ArrayList de ise yeni bir eleman eklendiğinde takip eden elemanların hareket ettirilmesi gerekmektedir. Bu ise performansı oldukça düşürecektir.
Eklemedeki bu avantaj, okuma işlemi sırasında dezavantaja dönüşebilmektedir. İstenilen elemanlara liste üzerinde sırasıyla hareket edilerek ulaşılabilmektedir.
LinkedList<T> koleksiyonu, ICollection<T>, IEnumerable<T>, ICollection, IEnumerable, ISerializable ve IDesializable arayüzlerini implement etmektedir.
Sıralı Listeler (Sorted Lists) Eğer sıralı bir listeye ihtiyacınız varsa, SortedList<Tkey, Tvalue> koleksiyonunu kullanabilirsiniz. Bu sınıf, bir anahtar değerine göre koleksiyondaki elemanları sıralar.
class Program static void Main(string[] args) SortedList<string, string> books = new SortedList<string, string>(); books.add(".net 2.0 Wrox Box", "978-0-470-04840-5"); books.add("professional C# 2005", "978-0-470-12472-7"); books["beginning Visual C# 2005"] = "978-0-7645-4382-1"; books["professional C# 2008"] = "978-0-470-19137-6";
Listenin üzerinde foreach ile hareket etmek mümkündür. Numaralandırıcı tarafından dönen elemanlar KeyValuePair<Tkey, Tvalue> türündedir.
class Program static void Main(string[] args) SortedList<string, string> books = new SortedList<string, string>(); books.add(".net 2.0 Wrox Box", "978-0-470-04840-5"); books.add("professional C# 2005", "978-0-470-12472-7"); books["beginning Visual C# 2005"] = "978-0-7645-4382-1"; books["professional C# 2008"] = "978-0-470-19137-6"; foreach(keyvaluepair<string,string> book in books) Console.WriteLine("0,1",book.Key,book.Value);
Sözlükler(Dictionaries) Sözlükler, bir anahtar değerini kullanarak herhangi bir elemana erişilmesini sağlayan karmaşık bir veri yapısıdır. Sözlükler, hash tables veya maps olarak da bilinirler. En temel özellikleri, bağlı oldukları anahtar değerine göre hızlı bir şekilde arama yapabilmeleridir (fast lookup).
.NET Framework pek çok dictionary sınıfını kullanıma sunmuştur. En bilineni; Dictionary<TKey, TValue> sınıfıdır. Bu sınıfın kullanımı SortedList<TKey,TValue> sınıfının kullanımına oldukça benzemektedir.
Diğer Dictionary Sınıflar