Generic Türler (Generic Types) -III [Generic Koleksiyon Sınıfları]

C#, VB.NET, ASP.NET Add comments

.NET 2.0 ile birlikte nongeneric koleksiyonların generic versiyonları çıkarıldığı gibi yeni koleksiyon sınıfları da geliştirildi. Aşağıdaki tabloda yeni nesil generic sınıfları ve bunlara karşılık gelen klasik koleksiyon sınıfları gösterilmiştir.

System.Collections.Generic System.Collections
Comparer<T> Comparer
Dictionary<K,T> HashTable
LinkedList<T> -
List<T> ArrayList
Queue<T> Queue
SortedDictionary<K,T> SortedList
Stack<T> Stack
ICollection<T> ICollection
IComparable<T> System.IComparable
IDictionary<K,T> IDictionary
IEnumerable<T> IEnumerable
IEnumerator<T> IEnumerator
IList<T> IList

Nesnelerin yanındaki argüman kısaltmalarından T, type, K, key ve V de value ifadesini temsil etmektedir.

Bu nesnelerin kullanımı, nongeneric versiyonlarından hiçbir farkı bulunmamaktadır. Aşağıdaki tabloda generic bir Dictionary nesnesinin kullanımı gösterilmiştir;

Imports System
Imports System.Collections.Generic

Module Module1
Sub Main()
Dim Kisiler As New Dictionary(Of String, Kisi)()
Kisiler.Add("K1", New Kisi("Ali", 10))
Kisiler.Add("K2", New Kisi("Veli", 17))
Kisiler.Add("K3", New Kisi("Mert", 19))

'Key değeri K3 olan kişinin bilgileri
Console.WriteLine("{0} " {1}", Kisiler("K3").AdSoyad, Kisiler("K3").Yas)
Console.ReadLine()
End Sub

Private Class Kisi
Public AdSoyad As String
Public Yas As Integer

Public Sub New(ByVal strAdSoyad As String, ByVal intYas As Integer)
    AdSoyad = strAdSoyad
    Yas = intYas
End Sub
End Class

End Module
using System;
using System.Collections.Generic;

class Program
{
static void Main(){
Dictionary Kisiler = new Dictionary();
Kisiler.Add("K1",new Kisi("Ali",10));
Kisiler.Add("K2", new Kisi("Veli", 17));
Kisiler.Add("K3", new Kisi("Mert", 19));

//Key değeri K3 olan kişinin bilgileri
Console.WriteLine("{0} " {1}", Kisiler["K3"].AdSoyad, Kisiler["K3"].Yas);
Console.ReadLine();
}//Main   

class Kisi
{
public string AdSoyad;
public int Yas;

public Kisi(string strAdSoyad,int intYas) {
    AdSoyad = strAdSoyad;
    Yas = intYas;
}//Kisi

}//Kisi

}//Program

Mert » 19

Koleksiyon nesnelerini sıralamak için kullandığımız IComparable arabirimi de generic yapıyı destekler.

Imports System
Imports System.Collections.Generic

Module Module1

Sub Main()
Dim Kisiler As New List(Of Kisi)()
Kisiler.Add(New Kisi("Ali", 10))
Kisiler.Add(New Kisi("Veli", 17))
Kisiler.Add(New Kisi("Mert", 19))

Console.WriteLine("Sıralama yapılmadan önce")

For Each oKisi As Kisi In Kisiler
    Console.WriteLine("   " & oKisi.ToString())
Next
Console.WriteLine()

'Listeyi sırala
Kisiler.Sort()

Console.WriteLine("Sıralama yapıldıktan sonra")
For Each oKisi As Kisi In Kisiler
    Console.WriteLine("   " & oKisi.ToString())
Next

End Sub

'Sıralama işlemini desteklemesi için IComparable implement edelim
Class Kisi
Implements IComparable(Of Kisi)
Public AdSoyad As String
Public Yas As Integer

Public Sub New(ByVal strAdSoyad As String, ByVal intYas As Integer)
    AdSoyad = strAdSoyad
    Yas = intYas
End Sub

Public Overloads Overrides Function ToString() As String
    Return String.Format("{0} {1} yaşında", AdSoyad, Yas)
End Function

Public Function CompareTo(ByVal Obj As Kisi) As Integer Implements IComparable(Of Kisi).CompareTo
    Return AdSoyad.CompareTo(Obj.AdSoyad)
End Function
End Class

End Module
using System;
using System.Collections.Generic;

class Program
{
static void Main(){
List Kisiler = new List();
Kisiler.Add(new Kisi("Ali",10));
Kisiler.Add(new Kisi("Veli", 17));
Kisiler.Add(new Kisi("Mert", 19));

Console.WriteLine("Sıralama yapılmadan önce");
foreach (Kisi oKisi in Kisiler)
{
    Console.WriteLine("   " + oKisi);
}
Console.WriteLine();

//Listeyi sırala
Kisiler.Sort();

Console.WriteLine("Sıralama yapıldıktan sonra");
foreach (Kisi oKisi in Kisiler)
{
    Console.WriteLine("   " + oKisi);
}

}//Main   

//Sıralama işlemini desteklemesi için IComparable implement edelim
class Kisi : IComparable
{
public string AdSoyad;
public int Yas;

public Kisi(string strAdSoyad,int intYas) {
    AdSoyad = strAdSoyad;
    Yas = intYas;
}//Kisi

public override string ToString()
{
    return String.Format("{0} {1} yaşında",AdSoyad,Yas);
}//ToString()

//IComparable'den gelen CompareTo metodu
public int CompareTo(Kisi obj)
{
    return AdSoyad.CompareTo(obj.AdSoyad);
}//CompareTo

}//Kisi

}//Program

Sıralama yapılmadan önce
Ali 10 yaşında
Veli 17 yaşında
Mert 19 yaşında

Sıralama yapıldıktan sonra
Ali 10 yaşında
Mert 19 yaşında
Veli 17 yaşında

Aynı mantıkla, stack, queue, sortedlist, inumerator, icomparer gibi class ve arabirimleri kullanabiliriz. Şimdi kendimiz bir generic koleksiyon sınıf hazırlayalım. Stack gibi çalışacak bu koleksiyona ekleme ve çıkarma işlemleri yapabilmek için AddItem() ve GetItem() metodlarını tanımlayacağız. GetItem() metodu, üstteki elemanı döndürecek ve daha sonra listeden çıkaracak. Burada dikkat etmemiz gereken nokta, C# tarafında listede herhangi bir eleman yoksa GetItem() metodu, liste türünün default değerini döndürür.

Imports System
Imports System.Collections.Generic

Module Module1

Sub Main()
Dim oLst As New Liste(Of String)()
oLst.AddItem("Ankara")
oLst.AddItem("İzmir")
oLst.AddItem("İstanbul")

'Listenin ilk elemanını okuyalım.
Console.WriteLine("1. Item : {0}", oLst.GetItem())
Console.WriteLine("2. Item : {0}", oLst.GetItem())
Console.WriteLine("3. Item : {0}", oLst.GetItem())
'Olmayan elemanını okuyacağız.
'GetItem() içerisinde item=Nothing yapmasaydık hata alırdık.
Console.WriteLine("4. Item : {0}", oLst.GetItem())
End Sub

Public Class Liste(Of T)
Private items As New List(Of T)()

Public Sub AddItem(ByVal item As T)
    items.Add(item)
End Sub

Public Function GetItem() As T
    Dim item As T = Nothing

    If items.Count <> 0 Then
	item = items(0)
	items.RemoveAt(0)
    End If
    Return item
End Function
End Class

End Module
using System;
using System.Collections.Generic;

class Program
{
static void Main(){
Liste oLst = new Liste();
oLst.AddItem("Ankara");
oLst.AddItem("İzmir");
oLst.AddItem("İstanbul");

//Listenin ilk elemanını okuyalım.
Console.WriteLine("1. Item : {0}", oLst.GetItem());
Console.WriteLine("2. Item : {0}", oLst.GetItem());
Console.WriteLine("3. Item : {0}", oLst.GetItem());
//Olmayan elemanını okuyacağız.
//GetItem() içerisinde default() operatörünü kullanmamış olsaydık hata alırdık.
Console.WriteLine("4. Item : {0}", oLst.GetItem());
}//Main   

public class Liste
{
private List items = new List();

public void AddItem(T item)
{
    items.Add(item);
}//AddItem

public T GetItem()
{
    T item = default(T);

    if (items.Count != 0)
    {
	item = items[0];
	items.RemoveAt(0);
    }
    return item;
}//GetItem

}//Liste

}//Program

1. Item : Ankara
2. Item : İzmir
3. Item : İstanbul
4. Item :

2 Responses to “Generic Türler (Generic Types) -III [Generic Koleksiyon Sınıfları]”

  1. Latif OZTURK Says:

    Merhaba,
    Bir sorum olacakti.
    Yukarudaki kodda Console.WriteLine(” ” + oKisi); demissiniz fakat override ettiginiz ToString()’ i cagirmadiginiz halde yukaridaki ciktiyi almamiz mumkun mu?

    Not : VB.Net tarafinda cagirilmis.
    Iyi calismalar.

  2. Ahmet Kaymaz Says:

    Merhaba Latif,

    Console.WriteLine(oKisi) ifadesi otomatik olarak System.Object sınıfından gelen ToString() yordamını çağırır.

Leave a Reply

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Giriş