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

Arşiv

Etiketlenen yazılar argumentexception

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, ... }