.NET Framework Kaynak Kodları

* .NET Framework kullanarak uygulama geliştirirken kullandığınız hali hazırdaki methodların nasıl yazıldığını merak ediyor musunuz?
* Eminim ben olsaydım şu sınıfı bu şekilde yazardım dediğiniz olmuştur.
* Kullanılan design pattern ları merak ettiğiniz de olmuştur.
* Acaba Sort() methodu hangi algoritmaya göre sıralama yapıyor dediğiniz de olmuştur.

Olmadıysa yazının devamı sizi ilgilendirmiyor :) Evet diyenler için;

ReferenceSource

Online olarak .NET Framework 4.5.1’e ait olan kodları gezebiliyorsunuz.
String’ten Int32’ye dönüşüm yapmamızı kolaylaştıran TryParse;

Reference Source’un geçmişine baktığımızda
2008 tarihli Scott Guthrie’nin blog yazısı mevcut: http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx

 

Haberin duyurulduğu sitede şöyle bir açıklama yapılmış:

we have published sources and PDBs for every major .NET framework update namely .NET framework 4.0 and 4.5. However these builds would be rendered effectively useless the moment any update to the framework was released, since the binaries on the updated box no longer matched the PDBs that were indexed on the reference source server.

Özetle, .NET Framework’üne gelen her bir update ile Reference Source sunucusundaki binaryler ile PDB‘ler arasındaki uygunsuzluk oluştuğu için şu ana kadar bu sistem istenilen randıman ile işlemiyormuş. Fakat,

Starting with .NET 4.5.1 we have radically changed the symbol indexing and publishing process to be in sync with the build process such that as and when updates are shipped , the corresponding PDBs are also updated to the reference source site appropriately.

denildiğine göre bundan sonra her bir update geldiğinde reference source sunucularındaki PDB’ler senkronize hale getirilecekmiş.

Kaynak: http://blogs.msdn.com/b/dotnet/archive/2014/02/24/a-new-look-for-net-reference-source.aspx

Kısa ve Öz – 1

“galatasaray” metninindeki karakterleri sağa kaydırdığımızda sırasıyla
“ygalatasara” , “aygalatasar” metinlerini elde ederiz.

Diyelim ki elimizde 2 adet metin var bu metinlerden birisini diğerinin kaydırılmış hali olup olmadığını nasıl tespit ederiz , daha doğrusu efektif olarak bu iş nasıl yapılır?

Şöyle yapılıyor ; döndürülmüş olduğunu varsaydığımız metninn sonuna kendisini ekliyoruz. Oluşan yeni metin içinde eğer orjinal metin varsa bu metin döndürülmüş demektir.

Örneğin; “onurbaysan” orjinal metin olsun. “baysanonur” da döndürülen metnimiz olsun. “baysanonurbaysanonur” metni “onurbaysan” ı içerdiği için “baysanonur” , “onurbaysan” ın döndürülmüş şeklidir diyoruz.

String text1 = "onurbaysan";
String text2 = "nurbaysano";

if (String.Concat(text2, text2).Contains(text1))
    Console.WriteLine("döndürülmüş");
else
    Console.WriteLine("güzel deneme!");

Bu kodu daha efektif hale getirmek için text1’in uzunluğu , text2’nin uzunluğundan farklı mı koşulunu eklersek kodu bir nebze daha hızlandırabiliriz.

Kaynak:
http://stackoverflow.com/questions/2553522/interview-question-check-if-one-string-is-a-rotation-of-other-string

LINQ ‘in Nimetleri – 2

Yazıya bakınız ile başlamak istiyorum (bkz: LINQ’in Nimetleri – 1 ).   Bu yazıda LINQ ile belirli bir aralıktaki asal sayıları bulduran sorgudan bahsedeceğim.

Belirli bir aralıktaki değerlerden asal olanları bulmak istediğimizde normalde aşağıdakine benzer bir kod yazarız.

List<int> primes = Enumerable.Range(min, max-1).ToList();
for (int i = min; i < max; i++)
{
    for (int j = 2; j * j <= i; j++)
         if (i % j == 0)
         {
             numbers.Remove(i);
             break;
         }
}

Burada yaptığımız işlemin aynısını aşağıdaki LINQ sorgusu ile yapıyoruz.

IEnumerable<int> numbers = Enumerable.Range(min,max-1);

IEnumerable<int> primes = from i in numbers
                          where !numbers.TakeWhile(x => x * x <= i).Any(x => i % x == 0)
                          select i;

TakeWhile : Returns elements from a sequence as long as a specified condition is true, and then skips the remaining elements.
(Türkçe’si: Yazılan koşulun yanlış olduğu yere kadar olan elemanları döndüren , koşul yanlış olduktan sonraki elemanlara bakmayan methottur.( Virgülden sonrası TakeWhile vs While)

Any             : Determines whether any element of a sequence exists or satisfies a condition.
(Türkçe’si: Koleksiyonda koşulu sağlayan eleman olup olmadığına belirleyen metottur.)

Farkettiğiniz üzere yukarıdaki sorguda “where” ifadesinden sonra “!”(değil) işareti var. Peki değil işareti olmadan aynı işlemi yapmaya kalksak nasıl yaparız?

Bunu da şu şekilde yapıyoruz:

IEnumerable<int> numbers = Enumerable.Range(min,max-1);

IEnumerable<int> primes = from i in numbers
                          where numbers.TakeWhile(x => x * x <= i).All(x => i % x != 0)
                          select i;

“Any” yerine “All kullanıp “where”  ifadesinden sonraki “!” işaretini de “All” methodunun içine yazdığımızda aynı işlemi gerçekleştirmiş oluyoruz.

All:           Determines whether all elements of a sequence satisfy a condition.
(Türkçe’si: Koleksiyondaki tüm elemanları koşulu sağladığını belirleyen metottur.) 

ASP.Net MVC Custom Route

Son zamanlarda uğraştıklarımın başında ASP.Net MVC geliyor. MVC , açılımı Model-View-Controller olan bir örüntüdür.

Model = Temel anlamıyla uygulama içinde kullanılacak olan veriler ile haşır neşir olduğumuz kısım oluyor.

View = İsminden de anlaşılacağı üzere , uygulamanın kullanıcı arayüzü diyebiliriz.

Controller = Model’daki verileri işlediğimiz , kullanıcı etkileşimi sonucu gerekli işlemleri yerine getirdiğimiz ve View’a gerekli verileri ilettiğimiz kısımdır.


Basit düzeydeki giriş bilgilerinden sonra, anlatmak istediğim kısıma gelelim. MVC’de Özel Rota(Custom Route) yazmaktan bahsedeceğim.

ASP.Net MVC ile birlikte gelen varsayılan rota şu şekildedir:

routes.MapRoute(
   "Default", // Route name
   "{controller}/{action}/{id}", // URL with parameters
   new { controller = "Home", action = "Index", id = UrlParameter.Optional
         } // Parameter defaults
);

 

Örnek bir senaryoda bu bilgisini inceleyecek olursak; farzedelim ki bir araba sitesi yapacağız.

Controller: Araba
Action: Detay
id: Cadillac

Cadillac marka otomobilleri listelemek istiyoruz. Varsayılan rotaya göre bu işlem için URL miz şu şekilde olacaktır:

…/Araba/Detay/Cadillac

Fakat bu URL pek kullanıcı dostu değil çünkü kullanıcı sizin Araba controller’ı altında tanımlamış olduğunuz actionları bilmek zorunda değildir. Fakat bunu …/Araba/Cadillac şeklinde yapacak olursanız bu URL daha kullanıcı dostu olacaktır.

Bu işlem mevcut rotanın yanına ek rota tanımlayarak gerçekleştirilir. Bunu da ASP.Net MVC projemizin altında bulunan “Global.asax”  dosyasını değiştirerek yapıyoruz. Bu dosyayı açtığınız zaman varsayılan rotaya ait kod kesiminin RegisterRoutes methodu altında olduğunu farkedeceksiniz. Biz de yeni rotamızı bu methodun içinde tanımlayacağız.

routes.MapRoute(
   "Araba",                               // Route name
   "Araba/{id}",                          // URL with parameters
   new { controller = "Araba", action = "Detay" }  // Parameter defaults
);

Burada dikkat edilmesi gereken en önemli husus , tanımlayacağımız rotanın , varsayılan rota tanımlamamız gerektiğidir. Çünkü aksi durumda varsayılan rota , tanımlayacağımız rotayı yoksayacaktır.

Bu durumda “Global.asax” dosyasında bulunan RegisterRoutes methodunun son şekli aşağıdaki gibi olacaktır.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
       "Araba",                               // Route name
       "Araba/{id}",                          // URL with parameters
       new { controller = "Araba", action = "Detay" }
    );

    routes.MapRoute(
       "Default", // Route name
       "{controller}/{action}/{id}", // URL with parameters
       new { controller = "Home", action = "Index", id =
               UrlParameter.Optional }
    );
}

LINQ ‘in Nimetleri – 1

LINQ yani Language INtegrated Query diğer bir deyişle Dil İle Bütünleşik Sorgu, .Net Framewok 3.5 ile birlikte gelen ve en basit haliyle koleksiyonlar üzerinde SQL benzeri söz dizimine sahip sorgu koşturmanızı sağlayan Microsoft teknolojisidir. En basit haliyle dedim çünkü MSDN üzerinde verilen açıklama şu şekilde:

“You can write LINQ queries in Visual Basic or C# with SQL Server databases, XML documents, ADO.NET Datasets, and any collection of objects that supports IEnumerable or the generic IEnumerable(Of T) interface.”

Her neyse basit bir örnekle giriş yapalım. Mesela elimizde 10 adet int tipinde sayı tutan listemiz olsun. Bu listede bulunan çift sayıları çekmek isteyelim.

İlk olarak bu yazımda anlatacağım örneklerde kullanacağım listemi rastgele sayılardan oluşturan kodu yazıyorum.

List<int> numbers = new List<int>();
Random rand = new Random();

for(int i = 0; i < 5; i++)
    numbers.Add(rand.Next(50));

numbers.Sort();

 

Şimdi ise çift sayıları getiren sorguyu yazalım. Normalde bu işlemi yapmak için listeyi dolaşır ve sıradaki eleman 2’ye bölünebiliyorsa çift der ve yeni bir listeye ekleriz. Bunu LINQ ile şu şekilde yapıyoruz.

var evens = from number in numbers
            where number % 2 == 0
            select number;

Satır satır yorumlayacak olursak;

from number in numbers : numbers koleksiyonu içinde bulunan değerleri number olarak adlandırıyorum.

where number % 2 == 0 : Bu “number” lardan 2 ye bölümünden kalan 0 olanları istiyorum.

select number : “number” ları getir.

Gördüğünüz üzere söz dizimi itibariyle SQL’e çok yakın ve anlaşılabilirliği yüksek.

Bu yazıda asıl bahsetmek istediğim örneğe gelecek olursak; tüm elemanları birbirinden farklı olan sıralı bir listede bulunan sayıların 2 li permütasyonlarını bulmak istiyorum. Bunu LINQ ile nasıl yaparım?

Sözlü olarak anlatacak olursak; ilk olarak bir sayı seçerim daha sonra kalan sayılar arasından bir sayı daha seçerim.

Adım adım kodlayalım:

var perm = from number1 in numbers
           from number2 in numbers
           where number1 != number2
           select new int[] { number1 , number2};

desek acaba ne sonuç alırız?

Hem 1,8 var hem 8,1. Burada sorguya number1<number2 koşulunu da eklersek , seçilecek olan 2. eleman seçilen 1. elemanın sağ tarafından seçileceği için sorun hallolacaktır.

var perm = from number1 in numbers
           from number2 in numbers
           where number1 != number2 && number1 < number2
           select new int[] { number1, number2 };


*** Burada select satırı neden farklı diye sorulabilir. Çünkü bir bu sorgua 2 adet değer seçeceğiz, dolayısıyla o 2 değerden oluşan bir dizi oluşturdum ve oluşan diziyi seçtim ben burada.

Sorgu sonucunu ekranda görmek için de bu kod parçacığını  kullanabilirsiniz.

foreach (var current in tuples)
    Console.WriteLine(current[0] + "," + current[1]);