<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>thexpot.net &#187; C#</title>
	<atom:link href="http://www.thexpot.net/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thexpot.net</link>
	<description>...olur arada öyle...</description>
	<lastBuildDate>Mon, 18 Jan 2010 13:23:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>180 milyon dolar maliyetli bug</title>
		<link>http://www.thexpot.net/2009/01/180-milyon-dolar-maliyetli-bug/</link>
		<comments>http://www.thexpot.net/2009/01/180-milyon-dolar-maliyetli-bug/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 13:28:57 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Notlar]]></category>
		<category><![CDATA[Programlama]]></category>

		<guid isPermaLink="false">http://www.thexpot.net/?p=195</guid>
		<description><![CDATA[Düşününki C++ için bir IDE hazırlamışsınız ve bu IDE de oldukça popüler olmuş. 20,000 geliştirici tarafından kullanılıyor ve yıllardır da bunu satıyorsunuz. IDE&#8217;nin performansı fena değil ne de olsa C++ derleyiciler yavaşlıkları ile ünlüdürler.


Fakat bu IDE&#8217;nin kullanıcılarından birisi (Andread Hausladen) öyle bir yama yapıyorki derleme zamanı %75 azalıyor.  Görünen o ki; derleme işlemi başlatıldığında [...]]]></description>
			<content:encoded><![CDATA[<p>Düşününki C++ için bir IDE hazırlamışsınız ve bu IDE de oldukça popüler olmuş. 20,000 geliştirici tarafından kullanılıyor ve yıllardır da bunu satıyorsunuz. IDE&#8217;nin performansı fena değil ne de olsa C++ derleyiciler yavaşlıkları ile ünlüdürler.<br />
<img src="http://imgs.xkcd.com/comics/compiling.png" alt="My code is compiling" /></p>

<p>Fakat bu IDE&#8217;nin kullanıcılarından birisi (<a href="http://andy.jgknet.de/blog/">Andread Hausladen</a>) öyle bir <a title="bcc32ptch" href="http://groups.google.com/group/borland.public.cppbuilder.non-technical/browse_thread/thread/5abe3bfd133f745a/84c2667dc99b4ffe?pli=1" target="_blank">yama</a> yapıyorki derleme zamanı %75 azalıyor.  Görünen o ki; derleme işlemi başlatıldığında derleyiciye IDE tarafından bazı callback fonksiyonları kaydediliyormuş ve bunlardan birisi de OpenFile fonksiyonuymuş. Sorun ise OpenFile fonksiyonunun aynı zamanda dosya var mı yok  mu kontrol etmek için de kullanılıyor olmasıymış ki bu da oldukça zaman kaybına neden oluyormuş. Andreas ise yamasında OpenFile çağırılmadan önce GetFileAttributes fonksiyonu ile dosyanın var olup olmadığının kontrol edilmesini, dosya varsa OpenFile çağırılmasını sağlamış ki bu da 30 saniyelik derleme süresini 4.5 saniyeye düşürmüş!</p>

<p>İşin ironik tarafı ise <a href="http://stackoverflow.com/questions/422539/energy-efficient-application-development" target="_blank">enerji tasarruflu uygulama geliştirme</a> için yapılabileceklerle ilgili StackOverflow&#8217;da sorulan bu soruda karşıma çıktı. İlk cevap şu an C++ Builder&#8217;ı geliştiren CodeGear&#8217;ın ürün sorumlusu <a href="http://blogs.codegear.com/nickhodges/" target="_blank">Nick Hodges</a>&#8216;dan gelmiş, ikinci cevap ise tam bir <a href="http://sozluk.sourtimes.org/show.asp?t=ayar+vermek" target="_blank">ayar</a> niteliğinde.</p>

<p>C++ Builder&#8217;ın yılda 200 gün çalışıp, günde 15 dakikasını derleme işleminin bitmesini bekleyerek harcayan  20000 geliştirici tarafından 5 yıldır kullanıldığını düşünürsek saatte 50$ masraf ile toplam maliyet 187.5 milyon doları buluyor. Borland&#8217;ın neden bu hale geldiğine şaşmamak lazım.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2009/01/180-milyon-dolar-maliyetli-bug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NUnit.Framework.SyntaxHelpers</title>
		<link>http://www.thexpot.net/2008/07/nunit-framework-syntaxhelpers/</link>
		<comments>http://www.thexpot.net/2008/07/nunit-framework-syntaxhelpers/#comments</comments>
		<pubDate>Thu, 31 Jul 2008 16:19:41 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Araçlar]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[NUnit]]></category>

		<guid isPermaLink="false">http://www.thexpot.net/?p=122</guid>
		<description><![CDATA[.Net&#8217;te test için NUnit&#8217;ten başka kütüphane kullanmıyorum. Uzun zamandır da 2.2 sürümünü kullanmaktaydım ve memnundum fakat geçenlerde 2.4 sürümündeki bir özellik dikkatimi çekti.
NUnit.Framework.SyntaxHelpers namespace&#8217;inin altında testleri daha okunaklı kılacak bir takım yardımcı sınıflar ve metodlar eklemişler, güzel olmuş.
Örneğin önceden yazdığımız bu testi:
Assert.IsNotNull(items);
Assert.AreEqual(2, items.Count);
artık şu şekilde yazabiliriz:
Assert.That(items, Is.Not.Null);
Assert.That(items.Count, Is.EqualTo(2));
İşinize yarayabilir.
]]></description>
			<content:encoded><![CDATA[<p>.Net&#8217;te test için NUnit&#8217;ten başka kütüphane kullanmıyorum. Uzun zamandır da 2.2 sürümünü kullanmaktaydım ve memnundum fakat geçenlerde 2.4 sürümündeki bir özellik dikkatimi çekti.
NUnit.Framework.SyntaxHelpers namespace&#8217;inin altında testleri daha okunaklı kılacak bir takım yardımcı sınıflar ve metodlar eklemişler, güzel olmuş.
Örneğin önceden yazdığımız bu testi:
<pre class="prettyprint">Assert.IsNotNull(items);
Assert.AreEqual(2, items.Count);</pre>
artık şu şekilde yazabiliriz:
<pre class="prettyprint">Assert.That(items, Is.Not.Null);
Assert.That(items.Count, Is.EqualTo(2));</pre>
İşinize yarayabilir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2008/07/nunit-framework-syntaxhelpers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dijkstra&#8217;nın En Kısa Yol Algoritması</title>
		<link>http://www.thexpot.net/2008/05/dijkstranin-en-kisa-yol-algoritmasi/</link>
		<comments>http://www.thexpot.net/2008/05/dijkstranin-en-kisa-yol-algoritmasi/#comments</comments>
		<pubDate>Sun, 18 May 2008 17:06:27 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Algoritmalar]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dijkstra'nın en kısa yol algoritması (DJK) ya da Dijkstra'nın deyişiyle "benim en kısa yol algoritmam"&#160; graf üzerinde bir noktadan diğer tüm noktalara en kısa yolu çıkarır ve bunu n noktalı bir grafta en kötü olarak O(n*n) zorlukta tamamlar. Daha önceden bahsettiğim <a href="http://www.thexpot.net/?q=node/107" target="_blank">Floyd-Warshall algoritması</a> ise tüm noktalar arasındaki en kısa mesafeyi O(n*n*n) zorlukta çıkarıyordu. Dikkat ettiyseniz birisi yolu diğeri mesafeyi çıkarıyor.]]></description>
			<content:encoded><![CDATA[<p>Dijkstra&#8217;nın en kısa yol algoritması (DJK) ya da Dijkstra&#8217;nın deyişiyle &#8220;benim en kısa yol algoritmam&#8221;  graf üzerinde bir noktadan diğer tüm noktalara en kısa yolu çıkarır ve bunu n noktalı bir grafta en kötü olarak <code>O(n*n)</code> zorlukta tamamlar. Daha önceden bahsettiğim <a href="http://www.thexpot.net/2008/01/floyd-warshall/" target="_blank">Floyd-Warshall algoritması</a> ise tüm noktalar arasındaki en kısa mesafeyi O(n<em>n</em>n) zorlukta çıkarıyordu. Dikkat ettiyseniz birisi yolu diğeri mesafeyi çıkarıyor.
Algoritmanın aşamalarını ayrı ayrı değerlendirdiğimizde anlamamız daha kolay olacaktır. Örnek olarak 10&#215;10&#8242;luk bir tahtanın üzerinde olduğumuzu düşünün. İlerlemeye (0,0) noktasından başlayıp, (9,9) noktasına ulaşmaya çalışacağız. Tahta üzerindeki her karede bir sayı olsun ve biz o kare üzerine geldiğimizde orada yazılı olan sayı kadar saniye beklemek zorunda kalalım. Bu durumda hedefimiz olan (9,9) noktasına en kısa zamanda nasıl ulaşırız?
<span id="more-112"></span>
Başlangıç noktasının diğer tüm noktalara olan mesafesini tutmak için bir tane Distance dizisine ve gittiğimiz yolu hatırlamamız için ise Previous dizisine ihtiyacımız olacak. Dizinin her elemanı tahta üzerindeki bir koordinata karşılık gelecektir. Örneğin (3,8) noktasının indeksini 3*Genişlik + 8 = 38 olarak hesaplayabiliriz. Başlangıç noktasının üzerinde olduğumuz için buraya olan mesafemiz 0, diğer tüm noktalara olan mesafemiz ise sonsuz olsun:</p>

<pre class='prettyprint'><code>Distances = new int[W*H];
Previous = new int[W*H];
for (int i = 0; i &lt; W*H; i++)
{
  Distances[i] = INF;
  Previous[i] = -1;
}
Distances[0] = 0;
</code></pre>

<p>Algoritmadaki her adımda kaynak bir nokta seçip, bu noktadan komşu noktalara gitmenin bize maliyetini hesaplayacağız ve bu nokta için bir daha hesap yapmayacağız. Bu yüzden hangi noktalar üzerinde çalıştığımızı da bir şekilde tutmamız gerekiyor. Bunun için bir liste kullanabilirsiniz. Gidilen noktaları listeden çıkarıp geriye kalanlar içinde hedefe en yakın olanı seçerek devam edebilirsiniz. Liste boşalana kadar bu işleme devam edip tüm noktalar için hesaplamalarımızı yapmış oluruz:</p>

<pre class='prettyprint'><code>var list = new List&lt;int&gt;();
for (int i = 0; i &lt; W * H; i++) list.Add(i);
while(list.Count &gt; 0)
{
  //hesaplamalar
}
</code></pre>

<p>Çapraz hareketler yapamayacağımız için her kare üzerinde gidilebilecek 4 yön var: sağa, sol, yukarı ve aşağı.</p>

<pre class='prettyprint'><code>private static readonly int[] dx = { 1, 0, -1, 0 };
private static readonly int[] dy = { 0, 1, 0, -1 };
</code></pre>

<p>Tüm bu yönlere hareket etmenin bizim için maliyeti nedir hesaplayalım ve Distance dizisinde bu noktaya karşılık gelen indekse bu değeri yazalım.</p>

<pre class='prettyprint'><code>while (list.Count &gt; 0)
{
  // hedefe en yakın noktanın indeksini al
  int bi = GetClosestIndex(list);
  int cx = bi % W, cy = bi / W; 

  for (int i = 0; i &lt; dx.Length; i++ )
  {
    int nx = cx + dx[i];
    int ny = cy + dy[i];
    // dışarıda kalıyorsa çık
    if (0 &gt; nx || nx &gt;= W || 0 &gt; ny || ny &gt;= H) continue;
    int ci = ny * W + nx;
    // bi'den ci'ye gidersek maliyeti nedir
    int cost = CostOfGoing(bi,ci);
    int alt = Distances[bi] + cost;
    //daha kazançlıysa burdan gidelim
    if (Distances[ci] &gt; alt)
    {
      Distances[ci] = alt;
      Previous[ci] = bi;
    }
  }
}
</code></pre>

<p>Bu işlem tüm noktalar için yapıldığında hedef noktanın kaynak noktaya olan mesafesi Distance[Hedef] olacaktır. Gidilecek yol ise şöyle çıkarılabilir:</p>

<pre class='prettyprint'><code>int target = 99;
List path = new List&lt;int&gt;();
while(Previous[target]!=-1)
{
    path.Add(target);
    target = Previous[target];
}
path.Reverse();
</code></pre>

<p>Dijkstra Algoritmasının en güçlü taraflarından birisi, çalışma süresinin kısa olmasıdır. Örnekte, kaynaktan başlayarak diğer tüm noktalara olan mesafeyi hesaplıyoruz sonra hedefimize giden yolu çıkarıyoruz. Bunu tüm noktalar için yapmak zorunda değiliz; eğer isterseniz algoritma içinde bi = target olduğu zaman algoritmayı sonlandırarak çalışma süresini de kısaltmış olabiliriz.
İkinci olarak ise; bir noktanın diğer noktaya olan mesafesini bir maliyet fonksiyonu ile hesaplıyorruz. Sadece bu fonksiyonu değiştirerek farklı sonuçlar elde edebiliriz. Örneğin; tahtanın üzerindeki her kareyi bir tepe olarak düşünelim ve üzerindeki sayı ise o tepenin yüksekliği olsun. Bir tepeden diğerine geçerken; tırmanmamız yükseklik farkı kadar, aşağı inmemiz ise yükseklik farkının yarısı kadar zaman alsın. Bu durumda maliyet fonksiyonumuzu aşağıdaki gibi değiştirmek bize istediğimiz sonucu verecektir:</p>

<pre class='prettyprint'><code>private int GetCostOfGoing(int bi, int ci)
{
    int diff = Height[bi] - Height[ci];
    if (diff &lt; 0) return -diff / 2;
    return diff;
}
</code></pre>

<p>Tüm bu işlemi görsel olarak takip etmeniz için bir WPF projesi hazırladım. <a href="http://www.thexpot.net/files/dijkstra.zip" target="_blank">Buradan</a> indirip inceleyebilirsiniz.</p>

<p>DipNot: Bu yazıyı, yazarken kaybettiğim o tuşuma armağan ediyorum.
<img src="http://www.thexpot.net/img/o.png" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2008/05/dijkstranin-en-kisa-yol-algoritmasi/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>C# 1 =&gt; 2 =&gt; 3</title>
		<link>http://www.thexpot.net/2008/04/csharp-1-2-3/</link>
		<comments>http://www.thexpot.net/2008/04/csharp-1-2-3/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programlama]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[C#'ın gelişmiyle birlikte  söz diziminde (syntax) de bazı iyileştirmeler olduğunu heralde duymuşsunuzdur. Bu yazıda c# 1'den itibaren c# 3'e kadar ne gibi değişikler olduğunu kısaca bir toparlayalım.

Bahsedeceğim iyileştirmelerin bir çoğunun temeli C# 2'de atıldı. Örneğin C# 1'de bir formu kapatmak için bir butona event handler eklemek istediğimizde aşağıdaki gibi bir kod yazmamız gerekiyordu.
<blockcode lang="csharp">
//C# 1
public Form1()
{
  InitializeComponent();
  button1.Click += new EventHandler(button1<em>Click);
}
void button1</em>Click(object sender, EventArgs e)
{
  Close();
}
</blockcode>]]></description>
			<content:encoded><![CDATA[<p>C#&#8217;ın gelişmiyle birlikte  söz diziminde (syntax) de bazı iyileştirmeler olduğunu heralde duymuşsunuzdur. Bu yazıda c# 1&#8242;den itibaren c# 3&#8242;e kadar ne gibi değişikler olduğunu kısaca bir toparlayalım.</p>

<p>Bahsedeceğim iyileştirmelerin bir çoğunun temeli C# 2&#8242;de atıldı. Örneğin C# 1&#8242;de bir formu kapatmak için bir butona event handler eklemek istediğimizde aşağıdaki gibi bir kod yazmamız gerekiyordu.
<span id="more-110"></span>
<pre class="prettyprint">
//C# 1
public Form1()
{
  InitializeComponent();
  button1.Click += new EventHandler(button1<em>Click);
}
void button1</em>Click(object sender, EventArgs e)
{
  Close();
}
</pre>
Fakat c# 2&#8242;de ise metodu EventHandler delegate&#8217;i içine almamıza gerek kalmadı çünkü compiler bizim yerimize bunu yapıyordu. Dolayısıyla kodumuzu şu şekilde sadeleştirebildik.
<pre class="prettyprint">
public Form1()
{
  InitializeComponent();
  button1.Click += button1<em>Click;
}
void button1</em>Click(object sender, EventArgs e)
{
  Close();
}
</pre>
C# 2 ile birlikte gelen Anonymous Delegate özelliği sayesinde ise yukarıdaki kodu şu şekilde kısaltabildik:
<pre class="prettyprint">
public Form1()
{
  InitializeComponent();
  button1.Click += delegate(object sender, EventArgs e) { Close(); };
}
</pre>
Hatta anonymous delegate içinde geçilen parametreleri hiç kullanmadığımız için bunları yazmamıza da gerek yoktu:
<pre class="prettyprint">
public Form1()
{
  InitializeComponent();
  button1.Click += delegate { Close(); };
}
</pre>
C# 2&#8242;de Genericlerin eklenmesiyle de aşağıdaki gibi kod yazabilmeye başladık.
<pre class="prettyprint">
string[] nums = new string[] { "1","2","3","4","5","6" };
int[] arr =Array.ConvertAll&lt;string, int>(nums, delegate(string input)
                                                              {
                                                                  return int.Parse(input);
                                                              });
</pre>
ConvertAll metodu string array ve string alıp int döndüren bir metod kabul ediyor. Fakat int.Parse metodu zaten string alıp int döndürüyor dolayısıyla yazımı şu şekilde sadeleştirebiliriz:
<pre class="prettyprint">
string[] nums = new string[] { "1","2","3","4","5","6" };
int[] arr =Array.ConvertAll&lt;string, int>(nums, int.Parse);
</pre>
Ve C# 3&#8242;de iyileşen type inference ve lambda expressionlar sayesinde yine bir kısaltma yapıp Type argumentlerden kurtulabiliriz:
<pre class="prettyprint">
string[] nums = new string[] { "1","2","3","4","5","6" };
var arr =Array.ConvertAll(nums, x=>int.Parse(x));
</pre>
Hatta array oluşturma işini de şöyle yazabiliriz:
<pre class="prettyprint">
string[] nums = new [] { "1","2","3","4","5","6" };
//ya da kısaca:
string[] nums = { "1","2","3","4","5","6" };
</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2008/04/csharp-1-2-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maziye gittim şöyle bir</title>
		<link>http://www.thexpot.net/2007/10/maziye-gittim-soyle-bir/</link>
		<comments>http://www.thexpot.net/2007/10/maziye-gittim-soyle-bir/#comments</comments>
		<pubDate>Thu, 11 Oct 2007 19:43:19 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[İlk çıktığında Visual C# 2008 Express Edition Beta 2'yi indirmiştim ama fırsat buldukça kurcalıyordum. Özellikle WPF'yi kurcalıyorum fakat henüz beta olduğu için sürekli göçüp duruyor hatta belli bir zaman sonra doğru yazdığım XAML'i bile derleyemez hale geliyor ve hatalı olduğunu söylerek beni yanıltıyordu. Ben de bir süre WPF'ye ara verdim ve diğer yenilikleri inceleye başladım.

Mesela LINQ. Deneme olsun diye bir klasör içinde yer alan dosyalardan adında önce o sonra a harfi geçen kaç tane var bir saydırayım dedim. Efendim oldu bitti. Yaptım, gözlerim karardı bir an ve şöyle bir maziye gittim, taa pascal günlerine...

Turbo Pascal veya Delphi veya dinamik olmayan herhangi bir dilde bu işi yapmak için en az 5-10 satır kod yazmak lazım. Peki bu işlem c# 3.0'da kaç satır? Bu yazıyı yazdığıma göre 5 satırdan kısa ve büyük ihtimalle 1 satır. Evet bildiniz, ben kod ekrandan taşmasın diye birkaç satıra bölüp yazıyorum buraya ama aslında 1 satır. 
<blockcode type="csharp">
Console.WriteLine(
  new DirectoryInfo(@"c:\downloads")
  .GetFiles()
  .Count(f => Regex.IsMatch(System.IO.Path.GetFileName(f.Name), "o.*a"))
);
</blockcode>

Aynı dosyaların toplam boyutu??
<blockcode type="csharp">
Console.WriteLine(
  new DirectoryInfo(@"c:\downloads")
  .GetFiles()
  .Where(x => Regex.IsMatch(System.IO.Path.GetFileName(x.Name), "o.*a"))
  .Sum(x => x.Length)
);
</blockcode>
Hiçbir döngü yok. Önümüz de bayram, hadi hayırlısı.]]></description>
			<content:encoded><![CDATA[<p>İlk çıktığında Visual C# 2008 Express Edition Beta 2&#8242;yi indirmiştim ama fırsat buldukça kurcalıyordum. Özellikle WPF&#8217;yi kurcalıyorum fakat henüz beta olduğu için sürekli göçüp duruyor hatta belli bir zaman sonra doğru yazdığım XAML&#8217;i bile derleyemez hale geliyor ve hatalı olduğunu söylerek beni yanıltıyordu. Ben de bir süre WPF&#8217;ye ara verdim ve diğer yenilikleri inceleye başladım.</p>

<p>Mesela LINQ. Deneme olsun diye bir klasör içinde yer alan dosyalardan adında önce o sonra a harfi geçen kaç tane var bir saydırayım dedim. Efendim oldu bitti. Yaptım, gözlerim karardı bir an ve şöyle bir maziye gittim, taa pascal günlerine&#8230;</p>

<p>Turbo Pascal veya Delphi veya dinamik olmayan herhangi bir dilde bu işi yapmak için en az 5-10 satır kod yazmak lazım. Peki bu işlem c# 3.0&#8242;da kaç satır? Bu yazıyı yazdığıma göre 5 satırdan kısa ve büyük ihtimalle 1 satır. Evet bildiniz, ben kod ekrandan taşmasın diye birkaç satıra bölüp yazıyorum buraya ama aslında 1 satır.</p>

<pre class='prettyprint'><code>Console.WriteLine(
  new DirectoryInfo(@"c:\downloads")
  .GetFiles()
  .Count(f =&gt; Regex.IsMatch(System.IO.Path.GetFileName(f.Name), "o.*a"))
);
</code></pre>

<p>Aynı dosyaların toplam boyutu??</p>

<pre class='prettyprint'><code>Console.WriteLine(
  new DirectoryInfo(@"c:\downloads")
  .GetFiles()
  .Where(x =&gt; Regex.IsMatch(System.IO.Path.GetFileName(x.Name), "o.*a"))
  .Sum(x =&gt; x.Length)
);
</code></pre>

<p>Hiçbir döngü yok.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/10/maziye-gittim-soyle-bir/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Yayılma Öncelikli Arama (Breadth-First Search)</title>
		<link>http://www.thexpot.net/2007/10/yayilma-oncelikli-arama/</link>
		<comments>http://www.thexpot.net/2007/10/yayilma-oncelikli-arama/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Algoritmalar]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Recursion doğru kullanıldığı zaman çok işimize yarayabilir. Özellikle ağaç tipi data yapılarının tüm nodelarını dolaşmak istediğimizde recursiondan faydalanabiliriz. Fakat bu ağaç yapısının ne kadar derinliğe sahip olduğunu kestiremediğimiz durumlarda bu yönteme çok da bel bağlamamak lazım zira stack (yığın) taşabilir ve overflow hatasıyla karşılaşabiliriz.

Alternatif bir yöntem ise kendi yığınımızı kullanarak bu işi yapmaktır. 
Genel adı ile Breadth First Search (Yayılma Öncelikli Arama):
<ul>
<li>Bir stack yaratılır ve root node'u bu yığına eklenir. (Queue ile de yapılabilir sadece işleme sıranız değişir)
<li>Herhangi bir node'un alt node'ları varsa bunlar da yığına eklenir
<li>Bulunduğumuz node işlenir ve yığından bir sonraki node çekilir. 
<li>Yığın boşalana kadar bu işlem tekrarlanır.
</ul>

Tüm dizin yapısını dolaşan örnek kod:]]></description>
			<content:encoded><![CDATA[<p>Recursion doğru kullanıldığı zaman çok işimize yarayabilir. Özellikle ağaç tipi data yapılarının tüm nodelarını dolaşmak istediğimizde recursiondan faydalanabiliriz. Fakat bu ağaç yapısının ne kadar derinliğe sahip olduğunu kestiremediğimiz durumlarda bu yönteme çok da bel bağlamamak lazım zira stack (yığın) taşabilir ve overflow hatasıyla karşılaşabiliriz.</p>

<p>Alternatif bir yöntem ise kendi yığınımızı kullanarak bu işi yapmaktır.
Genel adı ile Breadth First Search (Yayılma Öncelikli Arama):
<ul>
    <li>Bir stack yaratılır ve root node&#8217;u bu yığına eklenir. (Queue ile de yapılabilir sadece işleme sıranız değişir)</li>
    <li>Herhangi bir node&#8217;un alt node&#8217;ları varsa bunlar da yığına eklenir</li>
    <li>Bulunduğumuz node işlenir ve yığından bir sonraki node çekilir.</li>
    <li>Yığın boşalana kadar bu işlem tekrarlanır.</li>
</ul>
Tüm dizin yapısını dolaşan örnek kod:
<span id="more-98"></span>
<pre class="prettyprint">
Stack stack = new Stack();
stack.Push(new DirectoryInfo(@"c:\"));
while(stack.Count > 0)
{
  DirectoryInfo dir = stack.Pop();
  Console.WriteLine(dir.FullName);
  foreach (DirectoryInfo info in dir.GetDirectories())
    stack.Push(info);
}
</pre>
Queue kullanarak ise:
<pre class="prettyprint">
Queue queue = new Queue();
queue.Enqueue(new DirectoryInfo(@"c:\"));
while(queue.Count > 0)
{
  DirectoryInfo dir = queue.Dequeue();
  Console.WriteLine(dir.FullName);
  foreach (DirectoryInfo info in dir.GetDirectories())
    queue.Enqueue(info);
}
</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/10/yayilma-oncelikli-arama/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>String de null kontrolü</title>
		<link>http://www.thexpot.net/2007/07/string-de-null-kontrolu/</link>
		<comments>http://www.thexpot.net/2007/07/string-de-null-kontrolu/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[C# ve Java gibi dillerde string genelde bir sınıf ile temsil edilir. Dolayısıyla null olma durumu mevcuttur. Null kontrolünü 
<blockcode type="java">
if (name != null &#38;&#38; name == "t-hex") {
...}
</blockcode>

yazmak yerine kısaca

<blockcode type="java">
if ("t-hex".equals(name)) {
...}
</blockcode>

yazmak daha bir afilli durur(muş).]]></description>
			<content:encoded><![CDATA[<p>C# ve Java gibi dillerde string genelde bir sınıf ile temsil edilir. Dolayısıyla null olma durumu mevcuttur. Null kontrolünü 
<pre class="prettyprint">
if (name != null &amp;&amp; name == "t-hex") {
...}
</pre></p>

<p>yazmak yerine kısaca</p>

<pre class="prettyprint">
if ("t-hex".equals(name)) {
...}
</pre>

<p>yazmak daha bir afilli durur(muş).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/07/string-de-null-kontrolu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# 3.0 Yenilikleri</title>
		<link>http://www.thexpot.net/2006/04/csharp-30-yenilikleri/</link>
		<comments>http://www.thexpot.net/2006/04/csharp-30-yenilikleri/#comments</comments>
		<pubDate>Thu, 27 Apr 2006 06:51:22 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[c# 3.0 da kod yazımını kolaylaştırmak için bir çok yeni özellik eklenecek. Özellikle iyi bir IDE kullanmayan yazılımcıların ağzını sulandırabilecek bu özelliklerden en çarpıcı olanı bence Lamda ve Sorgu İfadeleri (SQL &#38; XQuery) ]]></description>
			<content:encoded><![CDATA[<p>C# 3.0 da kod yazımını kolaylaştırmak için bir çok yeni özellik eklenecek. Özellikle iyi bir IDE kullanmayan yazılımcıların ağzını sulandırabilecek bu özelliklerden en çarpıcı olanı bence Lamda ve Sorgu İfadeleri (SQL &amp; XQuery) 
<span id="more-59"></span></p>

<p>Özelliklerin bir kısmı söyle belirtilmiş Microsoft tarafından:
<h2><strong>Implicitly typed local variables</strong> (Kapalı tipli yerel değişkenler)</h2>
Bir değişkene atadığınız değerin ya da yapının tipinin belli olduğu durumlarda değişkenin tipini ayrıca belirtmenize gerek kalmayacak:
<pre class="prettyprint">var i = 5;
var s = "Hello";
var d = 1.0;
var numbers = new int[] {1, 2, 3};
var orders = new Dictionary();</pre>
Yukarıdaki kod aşağıdaki ile tamamen aynıdır
<pre class="prettyprint">int i = 5;
string s = "Hello";
double d = 1.0;
int[] numbers = new int[] {1, 2, 3};
Dictionary orders = new Dictionary();</pre>
Bu özellik sayesinde, foreach döngüsü de şu şekilde kullanılabilir::
<pre class="prettyprint">int[] numbers = { 1, 3, 5, 7, 9 };
foreach (var n in numbers) Console.WriteLine(n);</pre>
foreach için de ayrıca tipi tanımlamanıza gerek yok nasıl olsa numbers hep int&#8217;lerden oluşuyor.
<h2><strong>Extension methods</strong> (Genişletme metodları)</h2>
Delphi Dot Net&#8217;teki Helper Class&#8217;larla aynı kapıya çıkan yapılar. Yeni bir metod eklemek istediğiniz sınıfı değiştirmeden yazdığınız başka bir sınıfla yeni metodlar eklemenize olanak sağlıyor. Delphi&#8217;deki uyarı bunun içinde geçerli:
<span style="color: red;">Sadece çok mecbur kaldığınızda kullanın. Asla bir tasarım öğesi olarak kullanmayın</span></p>

<p>Aşağıdaki örnek int[] tipine Slice adında bir metod ekliyor
<pre class="prettyprint">namespace Acme.Utilities
{
    public static class Extensions
    {
        public static T[] Slice(this T[] source, int index, int count) {
            if (index &lt; 0 || count &lt; 0 || source.Length – index &lt; count)
                throw new ArgumentException();
            T[] result = new T[count];
            Array.Copy(source, index, result, 0, count);
            return result;
        }
    }
}</pre>
<pre class="prettyprint">int[] digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] a = digits.Slice(4, 3); // Extensions.Slice(digits, 4, 3) ile aynı işi yapar</pre>
<h2><strong>Lambda Expressions</strong> (Lambda İfadeleri)</h2>
Efendim, Phytonla hiç alakam olmadı ama duyduğuma göre phytonda fonksiyon döndüren lambda diye bir keyword varmış.</p>

<p>C# 3.0 bahsedilen Lambda ifadelerde bunun gibi bir iş yapıyor. Aslında bu az çok C++ macrolarına da benziyor ama çok daha gelişmiş bir şekli tabiî ki.
İster tip belirterek, ister belirtmeden generic fonksiyon gövdesi yazıyorsunuz. Tabi böyle yazılmış bir kodun okunabilirliği ne derece olur onu bilmiyorum ama esneklik bakımından çok şey katacağı kesin.
<pre class="prettyprint">class ItemList: List
{
    public int Sum(Func&lt;T,int> selector) {
        int sum = 0;
        foreach (T item in this) sum += selector(item);
        return sum;
    }
    public double Sum(Func&lt;T,int> selector) {
        double sum = 0;
        foreach (T item in this) sum += selector(item);
        return sum;
    }
}</pre>
Yukarıda ItemList adıyla bir sınıf tanımlanmış ve iki tane Sum metodu var. Sum metodu tüm Itemları parametre geçilen bir selector fonksiyonuna göre topluyor. Burada toplama işlemi için gerekli fonksiyonu da geçebildiğinize dikkat çekerim. Kullanımı da şöyle örneklenmiş:
<pre class="prettyprint">class Detail
{
    public int UnitCount;
    public double UnitPrice;
    ...
}
void ComputeSums() {
    ItemList orderDetails = GetOrderDetails(...);
    int totalUnits = orderDetails.Sum(d => d.UnitCount);
    double orderTotal = orderDetails.Sum(d => d.UnitPrice * d.UnitCount);
    ...
}</pre>
İlk toplam için sadece birim toplamını döndüren bir fonksiyon, ikinci toplam için birim fiyatının karesini döndüren bir fonksiyon geçilmiş oluyor. Dolayısıyla ilk toplam tüm item&#8217;ların birim toplamı olurken ikinci toplam ise tüm item&#8217;ların birim fiyatlarının kareleri toplamı oluyor.
<h2><strong>Object and collection initializers</strong> (Nesne ve Koleksiyon Başlatıcıları)</h2>
Bu özellikte yine programcıyı kod kalabalığından kurtarmak ve okunabilirliği arttırmak için eklenmiş zannımca:
<pre class="prettyprint">public class Point
{
    int x, y;
    public int X { get { return x; } set { x = value; } }
    public int Y { get { return y; } set { y = value; } }
}</pre>
Yukarı da bir Nokta sınıfı tanımlanmış ve X,Y adıyla iki tane propertysi mevcut. Public olarak tanımlandıkları için erişip değiştirmemiz mümkün. Bunu şöyle yapabiliriz
<pre class="prettyprint">Point p = new Point();
p.X = 4;
p.Y = 5;</pre>
ya da c# 3.0&#8242;da şöyle yapabiliriz:
<pre>var p = new Point {X=4,Y=5};</pre>
İkinci bir örnek ise şöyle verilebilir:
<pre class="prettyprint">public class Contact
{
    string name;
    List phoneNumbers = new List();
    public string Name { get { return name; } set { name = value; } }
    public List PhoneNumbers { get { return phoneNumbers; } }
}
var contacts = new List {
    new Contact {
        Name = "Chris Smith",
        PhoneNumbers = { "206-555-0101", "425-882-8080" }
    },
    new Contact {
        Name = "Bob Harris",
        PhoneNumbers = { "650-555-0199" }
    }
};</pre>
Yukarıdaki kodu aslen şöyle yazmalıydık:
<pre class="prettyprint">var contacts = new List();
var <strong>c1 = new Contact();
__c1.Name = "Chris Smith";
__c1.PhoneNumbers.Add("206-555-0101");
__c1.PhoneNumbers.Add("425-882-8080");
contacts.Add(</strong>c1);
var <strong>c2 = new Contact();
__c2.Name = "Bob Harris";
__c2.PhoneNumbers.Add("650-555-0199");
contacts.Add(</strong>c2);</pre>
<h2><strong>Query Expressions</strong> (Sorgu İfadeleri)</h2>
Koleksiyonlarda, arraylerde Hibernate&#8217;in HQL&#8217;sine benzer sorgular yazarak çalışabiliyoruz. Aslında bu C Omega ve LinQ karışımı bir şey olmuş. Sorgu ifadesi <em>from</em> kelimesiyle başlayıp <em>select</em> kelimesiyle sonlanıyor. Gruplama, süzme gibi işlemleri de belirtebiliyorsunuz.
<pre class="prettyprint">from c in customers
where c.City == "London"
select c.Name</pre>
Bu sorgu şu kodu yazmakla aynı :
<pre class="prettyprint">customers.
Where(c => c.City == "London").
Select(c => c.Name)</pre>
Doküman çokça yazım kuralı ve sorguların nasıl işleneceği üzerine odaklanmış. Hala geliştirilmekte olduğundan pek bir örnek mevcut değil şu an. İştah kabartıcı olduğu kesin!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/04/csharp-30-yenilikleri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dot Net ile T.C. Kimlik Sorgulama</title>
		<link>http://www.thexpot.net/2006/04/dot-net-ile-tc-kimlik-sorgulama/</link>
		<comments>http://www.thexpot.net/2006/04/dot-net-ile-tc-kimlik-sorgulama/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Delphi de <b>WSDL Importer</b> sihirbazı ile web servislerini kullanabilmek için gerekli kodu üretip projemizde kullanabiliyorduk. Benzer bir araç .Net Framework içinde de mevcut. ]]></description>
			<content:encoded><![CDATA[<p>Delphi de <strong>WSDL Importer</strong> sihirbazı ile web servislerini kullanabilmek için gerekli kodu üretip projemizde kullanabiliyorduk. Benzer bir araç .Net Framework içinde de mevcut. </p>

<p>Adı <strong>wsdl.exe</strong> ve kullanımı da çok basit. Parametre olarak sadece adresi geçiyorsunuz.</p>

<p>wdsl <a href="http://tckimlik.nvi.gov.tr/kpspublic.asmx?WSDL">http://tckimlik.nvi.gov.tr/kpspublic.asmx?WSDL</a></p>

<p>Sonuçta KPSPublicWebService.cs adıyla bir dosya elde ediyosunuz. Bunu projeye eklemeniz yeterli.
<pre class="prettyprint">
KPSPublicWebService ws = new KPSPublicWebService();
String tckimlikno = edtTCKimlikNo.Text;
TCKimlikNoDogrulamaSonucu sonuc = ws.TCKimlikNoDogrula(95464647544);
</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/04/dot-net-ile-tc-kimlik-sorgulama/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
