Arşiv

Etiketlenen yazılar IEnumerable

Euler – 7

17 Ekim 2011 Yorum yapılmamış

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

Orjinal Soru; By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.

What is the 10.001st prime number?

Türkçesi; İlk altı asal sayı: 2, 3, 5, 7, 11, ve 13, altıncı asal asal sayının 13 olduğunu görürüz.

10.001nci asal sayı kaçtır?

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

C# String Dizisini String Uzunluğuna Göre Sıralamak

19 Ağustos 2011 Yorum yapılmamış

Geliştirdiğimiz projelerde ekrana listeleyeceğimiz dizileri harf uzunluklarına göre sıralamak isteyebiliriz.

Bu makale ile, IEnumerable<string> tipinden değişkenlere bu özelliği nasıl ekleyeceğimizi göreceğiz.

Öncelikle Extension Method‘umuzu static bir sınıf içerisine (ExtensionManager) yazmamız lazım;

public static class ExtensionManager
{
	public static IEnumerable<string> Sirala(this IEnumerable<string> Liste)
	{
		string[] strArray = Liste.ToArray<string>();
		Array.Sort(strArray, new Comparison<string>(delegate(string Kelime1, string Kelime2)
		{
			if (Kelime1 == null && Kelime2 == null)
			{
				return 0;
			}
			else if (Kelime1 == null)
			{
				return -1;
			}
			else if (Kelime2 == null)
			{
				return 1;
			}
			else
			{
				if (Kelime1.Length < Kelime2.Length)
					return -1;
				else if (Kelime1.Length > Kelime2.Length)
					return 1;
				else
					return Kelime1.CompareTo(Kelime2);
			}
		}));

		return strArray;
	}
}

Yukarıdaki kod’da Array sınıfının static Sort method’unu çağırıyoruz. Karşılaştırma koşulunu, ikinci parametre’de delegate method olarak yazıyoruz.

Kullanımı;

var Rakamlar = new List { "12", "1", null, "2314", "55555", "123", "222" };

foreach (var Rakam in Rakamlar.Sirala())
{
	Console.WriteLine(Rakam);
}

Sonuç;

[null]
1
12
123
222
2314
55555

C# ile LINQ filtrelerinin üç farklı kullanımı (Predicate Function, Anonymous Method, Lambda Expression)

23 Mayıs 2011 Yorum yapılmamış

Listeler (IEnumerable<T> interface’ini implemente eden) üzerinde filtreleme yapmak için .Net 3.0’dan beri LINQ sorgularını kullanabiliyoruz.

LINQ ile gelen farklı operatör grupları sayesinde, listeler üzerinde sadece filtreleme yapmanın ötesinde bir kontrolümüz oluyor (daha detaylı bilgi için MSDN’de yeralan The .Net Standard Query Operators makalesini okuyabilirsiniz);

Bu yazımda, bir liste uzerinde LINQ sorgusu gerçekleştirmenin 3 farklı yolunu inceleyeceğiz;

  • Predicate
  • Anonymous Method
  • Lambda Sorgusu

Öncelikle üzerinde çalışacağımız bir listeye ihtiyacımız olacak, Enumerable sınıfının static Range method’u ile iki değer aralığındaki tam sayılardan oluşan listeyi kullanabiliriz;

Enumerable.Range(50, 100);

Predicate

private static bool CiftSayiKontrol(int Rakam)
{
	if (Rakam % 2 == 0)
		return true;
	else
		return false;
}

public static void Main(string[] args)
{
	var SonucListe = Enumerable.Range(1, 20).Where(CiftSayiKontrol);
	foreach (var Rakam in SonucListe)
	{
		Console.WriteLine(Rakam);
	}

	Console.ReadLine();
}

Sonuç;

LINQ Sorgusu - Predicate Function

Anonymous Method

public static void Main(string[] args)
{
	var SonucListe = Enumerable.Range(1, 20).Where(delegate(int number) {
		if (number % 2 == 0)
			return true;
		else
			return false;
	});

	foreach (var Rakam in SonucListe)
	{
		Console.WriteLine(Rakam);
	}

	Console.ReadLine();
}

LINQ Sorgusu - Anonymous Method

Lambda Sorgusu

public static void Main(string[] args)
{
	var SonucListe = Enumerable.Range(1, 20).Where(Rakam => Rakam % 2 == 0);
	foreach (var Rakam in SonucListe)
	{
		Console.WriteLine(Rakam);
	}

	Console.ReadLine();
}

LINQ Sorgusu - Lambda Expression

C# Liste’nin eleman içerdiğini kontrol etmek

30 Kasım 2010 1 yorum

Aşağıdaki kod parçasına, programlama üzerine yazılmış bir makaleyi okurken rastladım;

public void IsNullOrEmpty<T>(IEnumerable<T> koleksiyon)
{
	if (koleksiyon == null || koleksiyon.Count() == 0)
	{
		/// Koleksiyon'da hiç eleman yok
		/// Koleksiyon boş
	}
}

Yukarıdaki method IEnumerable generic tipinde parametre alıyor, null veya boş olup/olmadığını kontrol ediyor.

Karşılaştırmada kullanılan,

Liste.Count() == 0

kod parçası dikkatimi çekti.

Eğer IsNullOrEmpty fonksiyonuna parametre olarak ICollection<T> interface‘ini implemente etmeyen tipten bir değer gönderecek olursak (mesela LINQ sorgusu sonucu olarak IQueryable) Count method’u tüm liste üzerinde satır-satır ilerleyerek listedeki eleman adedini hesaplayacaktır.

Eğer fonksiyona parametre olarak IEnumerable interface‘ini implemente eden tipten bir değer gönderecek olursak, Count method’u, optimize edilmiş haliyle, sadece koleksiyonun Count özelliğini sorgulayacaktır.

Türkçe ifadesiyle; “Koleksiyonda eleman var mı?” sorusu yerine “Koleksiyon’da sıfır eleman mı var?” sorusunu sormuş oluyoruz.

Aslında çözüm basit, System.Linq namespace‘inde yeralan Any extension method‘unu kullanmamız gerekiyor;

public void Test<T>(IEnumerable<T> koleksiyon)
{
	if (koleksiyon == null || !koleksiyon.Any())
	{
		/// Koleksiyon'da hiç eleman yok
		/// Koleksiyon boş
	}
}

Bu yöntemin güzelliği, IEnumerable interface‘inin MoveNext methodunu sadece bir kere çağırması. Koleksiyonda bulunan eleman adedi ne olursa olsun, Any methodu sonucu çok hızlı birşekilde döndürecektir.

Hatta kendi extension method‘umuzu da Any methodunu kullanarak yazabiliriz;

public static bool IsNullOrEmpty<T>(this IEnumerable<T> koleksiyon)
{
	return koleksiyon == null || !koleksiyon.Any();
}

Artık extension method‘u da yazdığımıza göre, asıl method‘u iyileştirebiliriz;

public void Test<T>(IEnumerable<T> koleksiyon)
{
	if (koleksiyon.IsNullOrEmpty())
	{
		/// Koleksiyon'da hiç eleman yok
		/// Koleksiyon boş
	}
}

Euler – 5

04 Eylül 2010 1 yorum

Euler serisinin beşinci yazısında, Project Euler’in 5. sorusunu çözeceğiz;

Orijinal soru; 2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.

What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?

Türkçesi; 1′den 10′a kadar olan sayılara kalansız bölünebilen en küçük sayı 2520′dir.

1′den 20′ye kadar olan rakamların tamamına kalansız bölünebilen en küçük sayı kaçtır?

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

Euler – 2

23 Ağustos 2010 2 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…

Euler – 1

19 Ağustos 2010 1 yorum

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

Orijinal soru; If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.

Türkçesi; 3′ün veya 5′in katı olan 10′dan küçük tüm doğal sayıları listelersek, 3, 5, 6, ve 9′u elde ederiz. Bu katların toplamı 23′tür. 3′ün veya 5′in 1000′den küçük tüm katlarının toplamını bulunuz.

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