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

Arşiv

Etiketlenen yazılar while

Listedeki Her X’inci Elemanı Çekmek

27 June 2013 1 yorum

Bu yazıda elimizdeki listenin her x’inci elemanını çeken extension method yazacağız.

Örneğin, bir ankete cevap veren katılımcılardan her 5000’inci katılımcıyı seçmek istediğimiz durumlarda böyle bir method’a ihtiyaç duyarız.

TakeEvery() extension method‘u, Language Integrated Query (LINQ) method’larından Skip() ve Take() gibi çalışacak, fakat listenin belli sayıda öğesini atlayıp, belli sayıda öğesini seçmek yerine, her x’inci elemanı seçecek.

İlk olarak TakeEverySample isimli projeyi oluşturalım;

IEnumerable<T> sınıfına TakeEvery() method’unu eklemek için projemize ExtensionMethods isimli sınıfı ekleyelim;

public static class ExtensionMethods
{
	public static IEnumerable<T> TakeEvery<T>(this IEnumerable<T> list, int every)
	{
		if (list == null)
		{
			throw new ArgumentException("list parametresi boş geçilemez");
		}
		if (every < 1)
		{
			throw new ArgumentException("'every' parametresi en az 1 olabilir");
		}

		var step = 0;

		var enumerator = list.GetEnumerator();
		while (enumerator.MoveNext())
		{
			step++;
			if (step == every)
			{
				yield return enumerator.Current;
				step = 0;
			}
		}
	}
}

İlk olarak method'a geçilen parametrelerin değerlerini kontrol ediyoruz, eğer uygun olmayan bir değer verilmişse ilgili mesaj ile bir hata fırlatıyoruz.

list parametresinin enumerator'unu GetEnumerator() method'u ile aldıktan sonra MoveNext() method'u ile liste üzerinde ilerliyoruz.

step değişkeni every değişkeninin değerine eşit olduğunda aradığımız kaydı bulmuşuzdur, ilgili kaydı geri döndürüyoruz.

Örnek kullanım;

var rakamlar = Enumerable.Range(1, 1000000);

var her50000 = rakamlar.TakeEvery(50000);

// her50000 = { 50000, 100000, 150000, 200000, 250000, 300000, ... }

Euler – 10

10 February 2013 2 yorum

Euler serisinin onuncu yazısında, Project Euler’in 10. sorusunu çözeceğiz;

Orjinal Soru; The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17

Find the sum of all the primes below two million
Türkçesi; 10'dan küçük asal sayıların toplamı 17'dir; 2 + 3 + 5 + 7 = 17

2.000.000'dan küçük tüm asal sayıların toplamını bulun

Önce siz çözmeyi deneyin, çözemezseniz Devamını oku…

Bu kodda ne yanlış var? – 9

20 August 2011 12 yorum

Geliştirmekte olduğumuz bir projede C:\ sürücüsünde bulunan OnemliDosya.xls dosyasını sıkışırmamız ve OnemliDosya.zip dosyasını oluşturmamız istendi.

Hemen arkasından sıkıştırdığımız dosyayı açmamız ve OnemliDosya.Yeni.xls dosyasını oluşturmamız bekleniyor.

Aşağıdaki method’ları bu görev için yazdık;

public static void Compress(string ZiplenecekDosyaAdi, string ZipDosyaAdi)
{
	FileStream InputStream = File.Open(ZiplenecekDosyaAdi, FileMode.Open);
	FileStream OutputStream = File.Open(ZipDosyaAdi, FileMode.Create);
	GZipStream ZipStream = new GZipStream(OutputStream, CompressionMode.Compress);

	try
	{
		byte[] Buffer = new byte[InputStream.Length];
		InputStream.Read(Buffer, 0, Buffer.Length);
		ZipStream.Write(Buffer, 0, Buffer.Length);
	}
	finally
	{
		OutputStream.Close();
		InputStream.Close();
	}
}

public static void Decompress(string ZiplenecekDosyaAdi, string ZipDosyaAdi)
{
	FileStream Input = File.Open(ZiplenecekDosyaAdi, FileMode.Open);
	FileStream Output = File.Open(ZipDosyaAdi, FileMode.Create);
	GZipStream ZipStream = new GZipStream(Input, CompressionMode.Decompress);

	try
	{
		int Data = ZipStream.ReadByte();
		while (Data > 0)
		{
			Output.WriteByte((byte)Data);
			Data = ZipStream.ReadByte();
		}
	}
	finally
	{
		Output.Close();
		Input.Close();
	}
}

Yazdığımız method’ları aşağıdaki gibi kullanıyoruz;

Compress("C:\\OnemliDosya.xls", "C:\\OnemliDosya.zip");
Decompress("C:\\OnemliDosya.zip", "C:\\OnemliDosya.Yeni.xls");

Kodumuzdan emin olmamıza rağmen, çalışmadığını farkediyoruz.

Sizce problem nedir ve nasıl düzeltilebilir?

C# Windows tarzı dosya boyutu formatlayıcı

04 September 2010 1 yorum

Eğer uygulamalarınızda dosya sistemindeki dosyalar veya dizinler ile uğraşıyorsanız (listeleme, filtreleme, vs.) büyük ihtimalle dosya veya dizinlerin boyutlarını hespalayan bir yönteminiz vardır.

Genellikle (kolay olduğundan ötürü) byte cinsinden dosya boyutunu 1000’e (bin) böler kilobyte cinsinden veya 1.000.000’a (milyon) böler megabyte cinsinden karşılığını buluruz.

Fakat Windows işletim sisteminde dosya veya dizinlerin boyutları en yakın birime göre hesaplanır ve gösterilir.

Küçük dosyalar byte, kilobyte veya megabyte cinsinden gösterilirken, daha büyük dosyalar gigabyte hatta terabyte cinsinden gösterilebiliyor.

Eğer biz de uygulamamızda dosya boyutlarını Windows tarzında göstermek istiyorsak, öncelikle birimleri elde etmemize yarayacak bir enum tanımlamalıyız;

public enum Boyutlar
{
	byte,
	kilobyte,
	megabyte,
	gigabyte,
	terabyte,
	petabyte
}

Daha sonra, parametre olarak noktalı rakam alan, geriye string döndüren bir method tanımlamalıyız;

public static string FormatDosyaBoyutu(decimal DosyaBoyutu)
{
}

FormatDosyaBoyutu method’unda, önce Boyutlar enum‘ından bir örnek oluşturacağız ve byte değerini içermesini sağlayacağız;

Boyutlar BoyutTanim = Boyutlar.byte;

Daha sonra bir döngü aracılığıyla, DosyaBoyutu değişkeni 1000’e bölünebildiği sürece BoyutTanim değişkeninin bir üst birimi içermesini sağlayacağız;

while (Math.Round(DosyaBoyutu) >= 1000)
{
	DosyaBoyutu /= 1024;
	BoyutTanim++;
}

Son olarak, method’dan geriye DosyaBoyutu değişkenin virgülden sonra 2 hane içeren ve doğru birimi gösteren değeri döndürmesini sağlayacağız;

return string.Format("{0}\t{1}", DosyaBoyutu.ToString("f2"), BoyutTanim);

Dosya Boyutu Formatlayıcı

Örnek kodun tamamı;

using System;
using System.Text;

namespace DosyaBoyutuFormatlayici
{
	class Program
	{
		public enum Boyutlar
		{
			byte,
			kilobyte,
			megabyte,
			gigabyte,
			terabyte,
			petabyte
		}

		public static void Main(string[] args)
		{
			Console.WriteLine(FormatDosyaBoyutu(0));
			Console.WriteLine(FormatDosyaBoyutu(10));
			Console.WriteLine(FormatDosyaBoyutu(200));
			Console.WriteLine(FormatDosyaBoyutu(3000));
			Console.WriteLine(FormatDosyaBoyutu(40000));
			Console.WriteLine(FormatDosyaBoyutu(500000));
			Console.WriteLine(FormatDosyaBoyutu(6000000));
			Console.WriteLine(FormatDosyaBoyutu(70000000));
			Console.WriteLine(FormatDosyaBoyutu(800000000));
			Console.WriteLine(FormatDosyaBoyutu(9000000000));
			Console.WriteLine(FormatDosyaBoyutu(10000000000));
			Console.WriteLine(FormatDosyaBoyutu(200000000000));
			Console.WriteLine(FormatDosyaBoyutu(3000000000000));
			Console.WriteLine(FormatDosyaBoyutu(40000000000000));
			Console.WriteLine(FormatDosyaBoyutu(500000000000000));
			Console.WriteLine(FormatDosyaBoyutu(6000000000000000));
			Console.WriteLine(FormatDosyaBoyutu(70000000000000000));
			Console.WriteLine(FormatDosyaBoyutu(800000000000000000));
			Console.WriteLine(FormatDosyaBoyutu(9000000000000000000));
			Console.WriteLine(FormatDosyaBoyutu(10000000000000000000));

			Console.ReadLine();
		}

		public static string FormatDosyaBoyutu(decimal DosyaBoyutu)
		{
			Boyutlar BoyutTanim = Boyutlar.byte;

			while (Math.Round(DosyaBoyutu) >= 1000)
			{
				DosyaBoyutu /= 1024;
				BoyutTanim++;
			}

			return string.Format("{0}\t{1}", DosyaBoyutu.ToString("f2"), BoyutTanim);
		}
	}
}

Euler – 2

23 August 2010 3 yorum

Euler serisinin ikinci yazısında, Project Euler’in 2. sorusunu çözeceğiz;

Orijinal soru; Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …

Find the sum of all the even-valued terms in the sequence which do not exceed four million.

Türkçesi; Fibonacci serisinde her rakam, kendisinden önce gelen iki rakamın toplamıdır. 1 ve 2 ile başlayan serinin ilk 10 rakamı:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …

Bu serinin 4.000.000 (Dört Milyon) ‘dan küçük tüm çift rakamlarının toplamını bulunuz.

Önce siz çözmeyi deneyin, çözemezseniz Devamını oku…