Arşiv

Etiketlenen yazılar list

Dizide bir elemandan kaç adet olduğunu bulalım

Elimizdeki bir dizide, belli bir elemandan kaç adet olduğunu bulmamız gerekebilir.

Bunu yapmanın programatik olarak en kolay yolu LINQ sorgusu yazmaktır.

Örneğin aşağıdaki Extension Method, LINQ sorgusu ile aranan elemandan, ilgili listede kaç adet olduğu sonucunu döndürür;

public static int CountTimes< T >(this List< T > list, T item)
{
	return ((from t in list where t.Equals(item) select t).Count());
}

Örnek kullanım;

using System;
using System.Linq;
using System.Collections.Generic;

public static class Program
{
	static void Main(string[] args)
	{
		var list1 = new List< int >() { 1, 2, 3, 4, 5, 6, 7, 7, 8, 9 };
		var list2 = new List< string >() { "a", "b", "b", "b", "c", "d", "e", "f" };

		Console.WriteLine("Birinci listede 7, " + list1.CountTimes(7) + " adet var");
		Console.WriteLine("İkinci  listede b, " + list2.CountTimes("b") + " adet var");

		Console.ReadLine();
	}

	public static int CountTimes< T >(this List< T > list, T item)
	{
		return ((from t in list where t.Equals(item) select t).Count());
	}
}

Yukarıdaki örnek kodu çalıştırdığınızda, şöyle bir sonuç almanız lazım;

Birinci listede 7, 2 adet var
İkinci  listede b, 3 adet var

Bu kodda ne yanlış var? – 3

18 Şubat 2010 3 yorum

Aşağıdaki kodu çalıştırdığımızda Console’a “Bir”, “İki”, “Üç” yazdığını görüyoruz.

Sizce neden “Dört” elemanı yazılmıyor?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BuKoddaNeYanlisVar
{
    class Program
    {
        private List<string> _items = new List<string>();

        public List<string> Items
        {
            get { return _items.ToList(); }
            set { _items = value; }
        }
        static void Main(string[] args)
        {
            Program program = new Program();
            program.Items = new List<string> { "Bir", "İki", "Üç" };
            program.Items.Add("Dört");
            foreach (var item in program.Items)
                Console.WriteLine(item);
            Console.ReadLine();
        }
    }
}

Listede Filtreleme Yapmanın İyi – Kötü – Çirkin Yolu

15 Ocak 2010 1 yorum

Bütün gün, dizilerde filtrelemeler yaptıktan sonra, bu konu ile ilgili bir yazı yazmaya karar verdim. Elimizde bir List<int> olsun, dizideki 0‘dan büyük rakamları döndüren fonksiyon yazmak istediğimizi varsayalım;

Önce Kötü Yol;

private static List<int> FiltrelemeninKotuYolu(List<int> t)
{
	List<int> arrReturn = new List<int>();
	foreach (int i in t)
	{
		if (i > 0)
		{
			arrReturn.Add(i);
		}
	}
	return arrReturn;
}

Umarım artık böyle kodlar yazmıyorsunuzdur!!..

Çirkin Yol;

Önce bir Predicate Function tanımlarız;

private static bool Karsilastir(int i)
{
	if (i > 0)
	{
		return true;
	}
	return false;
}

Sonra, Predicate Function‘ı kullanırız;

private static List<int> FiltrelemeninCirkinYolu(List<int> t)
{
	Predicate<int> pred = new Predicate<int>(Karsilastir);
	return t.FindAll(pred);
}

Kötü Yol‘dan daha doğru olduğu ortada, ama Güzel bir yol değil.

Son olarak İyi Yol;

private static List<int> FiltrelemeninIyiYolu(List<int> t)
{
	return t.FindAll(n => n > 0);
}

İyi Yol aslında sadece Çirkin Yol‘un iyileştirilmiş hali. Predicate Method kullanacağımıza Lambda Expression kullanıyoruz. n => n > 0 : n‘nin 0‘dan büyük olduğu durumlar anlamına geliyor.

Bu kodda ne yanlış var? – 2

15 Ocak 2010 2 yorum

Aşağıdaki kod parçasını çalıştıralım. Sifir isimli değişkenin değerine baktığımızda 0 olduğunu görüyoruz.

List arrListe = new List(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
int Sifir = arrListe.Find(
	delegate(int i) {
		return i == 0;
	}
);

Listede 0 değeri yok!. Neden sonuç 0 dönüyor? Bu kodu nasıl düzeltebiliriz?

Kelimenin son harfi ile başlayan kelime oyunu

05 Ocak 2010 7 yorum

Eminim hepimiz, kendi aramızda, “Kelimenin Son Harfi ile Başlayan Kelime Oyunu“nu oynamışızdır.

Oyunun kuralları basittir, iki “oyuncu” karşılıklı oturur, oyunculardan biri, bir kelime söyleyerek oyunu başlatır. Sonra oyuncular sırayla, diğerinin söylediği kelimenin son harfi ile başlayan başka bir kelime söylemek zorundadır. Söyleyecek kelime bulamayan oyuncu “oyunu” kaybeder.

Gelin bu basit oyunu C# ile yazalım. Hemen ekran görüntüsü vererek başlıyorum;

Oyunu, bir Oyuncu, bir Bilgisayar Oyuncusuna karşı oynayacak. İhtiyacımız olan ilk şey, Bilgisayar Oyuncusu’nun içinden kelime seçeceği sözlük. Sözlük oluşturmak için daha önce yazdığım Web Sayfasından Sözlük Oluşturma ve Dizi Karıştırma makalelerini birleştirip kullanacağız.

btnYeniOyun butonunun Click olayında, txtAdres kontrolüne yazılmış olan web sayfasındaki kelimeler bir listeye dolduruluyor, ayıklanıyor, karıştırılıyor ve lbKullanilabilecekKelimeler ListBox kontrolünde gösteriliyor.

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;
	}
}
private void btnYeniOyun_Click(object sender, EventArgs e)
{
	lbKullanilabilecekKelimeler.Items.Clear();
	lbKullanilabilecekKelimeler.BeginUpdate();

	WebRequest wr = WebRequest.Create(txtAdres.Text);
	WebResponse ws = wr.GetResponse();
	StreamReader sr = new StreamReader(ws.GetResponseStream(), Encoding.UTF8);
	string response = sr.ReadToEnd();
	sr.Close();
	ws.Close();

	List<string> arrKelime = new List<string>();

	Regex r = new Regex("<(.|\n)*?>");
	foreach (string satir in r.Replace(response, "").Split(" \t\r\n({[]}),.;:*-+/?<>&%'#@=\"\\_".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
		if (satir.Trim().Length > 5 && !arrKelime.Contains(satir.Trim()))
			arrKelime.Add(satir.Trim());

	lbKullanilabilecekKelimeler.Items.AddRange(arrKelime.ListeKaristir().ToArray());

	lbKullanilabilecekKelimeler.EndUpdate();

	txtYeniKelime.Clear();
	txtOyunTarihce.Clear();
}

Oyun, birinci oyuncunun txtYeniKelime kontrolüne yazdığı kelime ile başlıyor.

string OncekiKelimeninSonHarfi = string.Empty;
private void btnYeniKelime_Click(object sender, EventArgs e)
{
	if (txtYeniKelime.Text != "" && txtYeniKelime.Text.StartsWith(OncekiKelimeninSonHarfi))
	{
		string Kelime = txtYeniKelime.Text.Trim();
		txtOyunTarihce.Text = string.Format("(O): {0}{1}{2}", Kelime, Environment.NewLine, txtOyunTarihce.Text);
		txtYeniKelime.Clear();
		KelimeSec(Kelime);
		txtYeniKelime.Focus();
	}
}

Bilgisayar Oyuncusu Sözlük’ten kelimenin son harfi ile başlayan kelimelerden bir tanesini rastgele olarak seçiyor.

Kullandığı her kelimeyi lbKullanilabilecekKelimeler ListBox kontrolünden çıkartıp, lbKullanilmisKelimeler ListBox listesine ekliyor.

private void KelimeSec(string OncekiKelime)
{
	Random r = new Random();

	var Kelimeler = (from k in lbKullanilabilecekKelimeler.Items.OfType<string>() where k.StartsWith(OncekiKelime.Substring(OncekiKelime.Length - 1, 1)) select k).ToList<string>();

	if (Kelimeler.Count == 0)
	{
		MessageBox.Show(lbKullanilmisKelimeler.Items.Count + ". Kelimede Bilgisayar Oyuncusu oynayacak Kelime bulamadı!.", "Oyun Bitti!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
		return;
	}

	int Sira = r.Next(0, Kelimeler.Count);
	string Kelime = Kelimeler[Sira];
	OncekiKelimeninSonHarfi = Kelime.Substring(Kelime.Length - 1, 1);

	lbKullanilabilecekKelimeler.Items.Remove(Kelime);
	lbKullanilmisKelimeler.Items.Add(Kelime);

	txtOyunTarihce.Text = string.Format("(B): {0}{1}{2}", Kelime, Environment.NewLine, txtOyunTarihce.Text);
}

Oyun, Bilgisayar Oyuncusu’nun kelime bulamamasına kadar devam ediyor.

Oyunun kaynak kodlarını buradan indirebilirsiniz.

C# ile Dizi Karıştırma

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.

C# ile Web Sayfasından Sözlük Oluşturma

Bir web sayfasının (Bir programcının dünyası, Karalamalar, Fatih DurğutNTVMSNBC, Wikipedia gibi..) içeriğini okuduktan sonra, Html taglarından ayıklayıp bir sözlük oluşturabiliriz.

Bu yazımda, C# ve Regex kullanarak böyle bir uygulamayı nasıl yazabileceğimizi anlatacağım.

Yukarıdaki resimdeki formu oluşturduysanız, Button‘un Click olayını yazmaya başlayalım;

WebRequest wr = WebRequest.Create(txtAdres.Text);
WebResponse ws = wr.GetResponse();
StreamReader sr = new StreamReader(ws.GetResponseStream(), Encoding.UTF8);
string response = sr.ReadToEnd();
sr.Close();
ws.Close();

List<string> arrSozluk = new List<string>();
Regex r = new Regex("<(.|\n)*?>");
foreach (string satir in r.Replace(response, "").Split(" \t\r\n({[]}),.;:*-+/?<>&%'#@=\"\\_".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
	if (!arrSozluk.Contains(satir.Trim()))
		arrSozluk.Add(satir.Trim());

StringBuilder sb = new StringBuilder();
foreach (string satir in arrSozluk)
	sb.AppendLine(satir);

txtSozluk.Text = sb.ToString();

Regex nesnesi ile Html taglarını, response‘tan siliyoruz. Daha sonra, kelimeleri bölmek için Split fonksiyonunu kullanıyoruz.

Generic List sınıfından bir nesneye her bir kelimeyi ekliyoruz.

Son olarakta, Generic List içerisindeki kelimeleri TextBox aracılığı ile ekrana yazdırıyoruz.

Uygulamanın kaynak kodlarına buradan erişebilirsiniz.