Shuffle | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar shuffle

Generic Dictionary sınıfına karıştırıcı (shuffle) Extension Method yazalım

03 October 2011 Yorum yapılmamış

Winamp MP3 oynatıcısında çalma listesini (playlist) rastgele sıra ile karıştırabiliyorsunuz. Benzer özelliği kendi projelerimizde uygulamak isteyebiliriz.

Daha önce, C# ile Dizi Karıştırma yazısında bir dizi’yi (List<T>) nasıl karıştıracağımızı incelemiştik.

Bu yazı ile Karıştırma (Shuffle) yeteneğini Generic Dictionary (Dictionary<TKey, TValue>) ekleyeceğimizi inceleyeceğiz.

İlk olarak, ExtensionManager isminde static bir sınıf oluşturalım;

public static class ExtensionManager
{
	public static Dictionary<TKey, TValue> Shuffle(this Dictionary<TKey, TValue> liste)
	{
		Random r = new Random();
		return liste.OrderBy(x => r.Next()).ToDictionary(item => item.Key, item => item.Value);
	}
}

ExtensionManager sınıfının Shuffle() isminde bir method’u var.

Bu method, Random sınıfından yeni bir instance‘ın Next() method’unu kullanarak, liste değişkeninin her bir elemanını rastgele bir değerle sıralıyor.

Böylece, Shuffle() method’u her çağırıldığında liste değişkeninin elemanlarının rastgele sıralandığını görüyoruz.

Örnek Kullanım;

Dictionary<int, string> liste = new Dictionary<int, string>();

for (int iLoop = 0; iLoop < 5; iLoop++)
{
	liste.Add(iLoop, "Eleman " + iLoop);
}
//0, Eleman 0
//1, Eleman 1
//2, Eleman 2
//3, Eleman 3
//4, Eleman 4

Dictionary<int, string> karistirilmis = liste.Shuffle();
//2, Eleman 2
//1, Eleman 1
//3, Eleman 3
//0, Eleman 0
//4, Eleman 4

C# ile Dizi Karıştırma

29 December 2009 1 yorum

Bu yazımda, bir dizi’nin C# ile nasıl karıştırılacağı (shuffle edileceği) ile ilgili bir örnek yapacağım.

Aşağıdaki formu oluşturarak, hemen programlamaya başlayalım.

İlk ihtiyacımız olan şey, tabiiki bir Liste. Rastgele kelimelerden oluşan karışık bir liste oluşturmak için, aşağıdaki RastgeleKelimeUret fonksiyonunu yazalım.

const string Harfler = "1234567890abcdefghijklmnopqrstuvwxyz";
Random r = new Random();

public string RastgeleKelimeUret()
{
	char[] arrReturn = new char[15];

	Parallel.For(0, 15, iLoop => {
		arrReturn[iLoop] = Harfler[r.Next(0, Harfler.Length - 1)];
	});

	return new string(arrReturn);
}

Form’umuzun Load olayında, Parallel For yeteneklerinden faydalanarak, 15 harften oluşan 100 adet rastgele kelime üretiyoruz ve OrjinalListe isimli Generic Collection‘a dolduruyoruz.

private void MainForm_Load(object sender, EventArgs e)
{
	Parallel.For(0, 100, iLoop => {
		OrjinalListe.Add(RastgeleKelimeUret());
	});

	lbOrjinalListe.BeginUpdate();

	for (int iLoop = 0; iLoop < OrjinalListe.Count; iLoop++)
		lbOrjinalListe.Items.Add(OrjinalListe[iLoop]);

	lbOrjinalListe.EndUpdate();
}

Karıştır butonunun Click olayında ise; OrjinalListe collection’ının ListeKaristir() fonksiyonunu kullanıyoruz.

private void btnKaristir_Click(object sender, EventArgs e)
{
	lbKaristirilmisListe.BeginUpdate();

	lbKaristirilmisListe.Items.Clear();

	List<string> KaristirilmisListe = OrjinalListe.ListeKaristir();

	for (int iLoop = 0; iLoop < KaristirilmisListe.Count; iLoop++)
		lbKaristirilmisListe.Items.Add(KaristirilmisListe[iLoop]);

	lbKaristirilmisListe.EndUpdate();
}

Generic dizilerde ListeKaristir() isminde bir fonksiyon bulunmaz. Nereden geliyor bu fonksiyon?

public static class ExtensionManager
{
	private static Random r = new Random();

	public static List<T> ListeKaristir<T>(this List<T> Liste)
	{
		List<T> tmpList = Liste.GetRange(0, Liste.Count);
		List<T> arrReturn = new List<T>();

		while (tmpList.Count > 0)
		{
			int rastgele = r.Next(0, tmpList.Count);
			arrReturn.Add(tmpList[rastgele]);
			tmpList.RemoveAt(rastgele);
		}

		return arrReturn;
	}
}

ExtensionManager isimli static class‘ın içerisine yazdığım ListeKaristir<T> fonksiyonundan geliyor. İlk parametreye eklediğim this anahtar kelimesine dikkat edelim. Bu sayede, List<T> yapısında olan tüm nesnelerde ListeKaristir() fonksiyonunun çalışmasını sağlamış olduk.

Uygulamanın kaynak kodlarını buradan indirebilirsiniz.