LINQ ile DataTable’den Farklı, Sıralı İsim Listesi Nasıl Alınır

LINQ kullanarak bir DataTable‘dan veri manipüle etmek oldukça güçlü olabilir, ancak doğru şekilde ele alınmadığında beklenmedik sonuçlara yol açabilir. Bu blog yazısında yaygın bir sorunu keşfedeceğiz: Bir DataTable’dan benzersiz isimlerin sıralı bir listesini oluşturmak. Basit bir sorgunun beklenen sıralamayı neden sağlamadığını inceleyecek ve yapılandırılmış bir çözüm sunacağız.

Sorun

Bir isimler sütunu içeren bir DataTable‘ınız var ve bu isimlerin alfabetik olarak sıralanmış farklı bir koleksiyonunu çıkarmak istiyorsunuz. Tipik bir LINQ sorgusu şöyle görünür:

var isimler =
    (from DataRow dr in dataTable.Rows
    orderby (string)dr["Name"]
    select (string)dr["Name"]).Distinct();

İlk bakışta bu doğru gibi görünse de, orderby ifadesinin son sonuçta beklenen sıralamayı sağladığını fark edemeyebilirsiniz. Neden bu böyle?

Sorunun Anlaşılması

Sıralama işleminden sonra Distinct() metodunu kullandığınızda, genellikle kafa karışıklığına yol açabilir. Farklı değerleri elde etme süreci, değerlerin nasıl sıralandığına göre ayrı bir süreçtir.

Sıralamanın Çalışmama Sebebi

  • Distinct() metodu, orderby ifadesi tarafından kurulan sıralamayı koruyamayabilir. Verileri işlerken, yalnızca farklı değerlere odaklanır ve sıralamayı korumaz.

Hem benzersizlik hem de sıralama elde etmek için LINQ yaklaşımımızı ayarlamamız gerekiyor.

Yapılandırılmış Bir Çözüm

Benzersiz ve sıralı isimler elde etmek için süreci üç net adıma ayırabilirsiniz:

Adım 1: İsimleri Yeni Bir Listeye Seçin

Öncelikle, tüm isimleri bir koleksiyona toplayın. Gerekirse bu adımda bir projeksiyon yapabilirsiniz.

var x1 = 
    (from DataRow dr in dataTable.Rows
    select (string)dr["Name"]).ToList();

Adım 2: Farklı Bir Liste Oluşturun

Daha sonra, Adım 1’de elde edilen koleksiyondan farklı bir liste oluşturun. Bu adım, tekrarlayan isimleri filtreleyecektir.

var x2 = x1.Distinct().ToList();

Adım 3: Sıralı Bir Liste Oluşturun

Son olarak, benzersiz listeyi alıp alfabetik olarak sıralayın.

var siraliIsimler = x2.OrderBy(isim => isim).ToList();

Tam Kod Örneği

İşte bir araya getirildiğinde tam kodun görünüşü:

var x1 = 
    (from DataRow dr in dataTable.Rows
    select (string)dr["Name"]).ToList();

var x2 = x1.Distinct().ToList();

var siraliIsimler = x2.OrderBy(isim => isim).ToList();

Sonuç

LINQ sorgusunu birden fazla parçaya ayırarak, bir DataTable‘dan alfabetik olarak sıralanmış bir isim listesi elde edebiliriz. Bu yöntem, kodunuzun okunabilirliğini ve sürdürülebilirliğini artırarak, sürecin her adımının net ve mantıklı olmasını sağlar.

Bu yapılandırılmış yaklaşım, benzersiz isimleri istediğiniz sırada almanızı garanti eder ve C# geliştirme projelerinizde güvenilir bir çözüm sunar.

Bu yöntemi denemekten çekinmeyin ve verilerinizin ihtiyaçları için nasıl çalıştığını görün!