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

Arşiv

Etiketlenen yazılar count

C# ile iki tarih arasında belli bir günden kaç adet olduğunu bulmak

02 February 2013 Yorum yapılmamış

Geliştirdiğim projede iki tarih aralığında belirli bir günden kaç adet olduğunu bulmam gerekti.

Bunun için iki tarih arasındaki gün farkını alıp, bir tarih listesi oluşturmak için kullanıyorum, daha sonra tarih listesinin içinde istediğim gün’den kaç tane olduğunu sayıyorum.

Örneğin 2013 yılındaki Pazartesilerin adedi için;

var baslangic = new DateTime(2013, 1, 1);
var bitis = new DateTime(2013, 12, 31);
var toplamGun = (int)bitis.Subtract(baslangic).TotalDays + 1;

var tarihListe = Enumerable.Range(1, toplamGun).Select(e => baslangic.AddDays(e));

var gunAdet = tarihListe.Where(e => e.DayOfWeek == DayOfWeek.Monday).Count();

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

23 May 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 November 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ş
	}
}

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

20 July 2010 Yorum yapılmamış

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

Sql Server COUNT ve COUNT_BIG Fonksiyonları

19 January 2010 Yorum yapılmamış

COUNT() sistem fonksiyonu, parametre olarak aldığı alandaki satır sayısını INT tipinde geri döndürür.

COUNT_BIG() sistem fonksiyonunun COUNT() fonksiyonundan farkı, elde ettiği sonucu BIGINT tipinde geri döndürmesidir.

INT veritipinin sınırları : -2^31 (-2,147,483,648) – 2^31-1 (2,147,483,647)

BIGINT veritipinin sınırları : -2^63 (-9,223,372,036,854,775,808) – 2^63-1 (9,223,372,036,854,775,807)

Eğer elde edeceğiniz sonucun INT veritipinin sınırlarına sığmayacağını düşünüyorsanız, yapmanız gereken COUNT_BIG() fonksiyonunu kullanmaktır.