9 Ocak 2018 Salı

Foreach ve Linq Kullanımı

      S.a. Arkadaşlar,
      Bir önceki yazıda belirttiğim gibi bu aralar kodun kalitesi ile ilgili ufak tefek şeyler okumaya çalışıyorum. foreach kullanımın ile ilgili örneklere göz atarken karşıma burada sorulan bir soru çıktı. Soru şöyle :
foreach (var item in items)
{
    if (item.Field != null)
        continue;

    if (item.State != ItemStates.Deleted)
        continue;
    
     //kod
}

foreach (var item in items.Where(i => i.Field != null && i.State != ItemStates.Deleted))
{
    //kod
}



   1.Kod bloğu yerine 2.ciyi kullanıyorum ama nedeni nedir denmiş. Performans farkları var mı ? 2.bloktaki item.Where ile başlayan kısım aklıma daha önce yazdığım bir kodu getirdi. Benim kodum da şöyleydi :
foreach (DataRow dr in dt.Rows)
            {
                if (dr["IsDirty"].GetBoolean())
                {
                    //kodlar
                }
            }

   Elimde bir DataTable var. Ve ben o DataTable'deki sadece değişen kayıtları almak istiyorum. Değişen kayıtları daha önce IsDirty = true demiştim. Buradaki kodu görünce hemen koduma dönüp değiştirme isteği oldu, fakat verilen cevap daha da hoş olmuştu açıkçası. Gerekliyi düzenlemeyi yaptıktan sonra kodumun yeni hali şöyle oldu.
var dirtyDt = dt.AsEnumerable().Where(d => d.Field<bool>("IsDirty")).CopyToDataTable();
foreach (DataRow dr in dirtyDt.Rows)
{
     //kodlar
}

     Bu şekilde kodu yaptığımızda kodun içinde debug yapıp nerede hangi değeri aldığına bakmaktan da kurtuluruz. Direkt olarak dirtyDt bakarsak istediğimize ulaşmış oluruz.

    Şimdi bu konuyla alakalı başka bir örneğe geçelim. Benzer işlemler farklı yollarla yapmayı deneyeceğiz. Bu örnekte DataTable yerine elimizde bir string dizisi var ve onun üzerine de bazı işlemler gerçekleştireceğiz.
string[] letters = { "d", "c", "a", "b" };
var sorted = from letter in letters 
              orderby letter ascending
              select letter;

var filtered = sorted.Where(d => !d.Equals("b"));
foreach (string value in filtered)
{
    Console.WriteLine(value);
}

Console.WriteLine("----");

var filteredAndSorted = from value in letters.AsEnumerable()
                         where !value.Equals("b")
                         orderby value descending
                         select value;

foreach (string value in filteredAndSorted)
{
      Console.WriteLine(value);
}

    1.Aşamada yine yukarıda belirtmiş olduğumuz gibi elimizde karışık bir string dizisi var. Öncelikle buradaki verileri çekip alfabetik olarak sıralıyoruz. Daha sonra bunun üzerinden foreach içinde if ile her defasında "b" harfini aramak yerine. Linq ile arama yapıp , "b" dışındakileri değerleri aldık ve foreach ile yazdırdık.

    2.Aşamada ise farklı olarak sıralama (alfabenin tersine "descending") ve filtreleme işlemini aynı yerde yapıyoruz. Where koşulunu direkt olarak select ifadesiyle birlikte kullandık. Ve hazır olan diziyi foreach ile yazdırdık.

     Bu konu gerçekten geniş ve oldukça kullanışlı bir konu. Daha bir çok şekilde sql'imizi geliştirdiğimiz ölçüde yazdıklarımızı da geliştirebiliriz. Burada elimden geldiğince öğrendiklerimi yazıyorum. Yanlışlık yaptığım veya eklemek istediğiniz yerler olduğunda tamamlarsanız sevinirim. Bir kaç kaynak verip yazıyı bitirmek istiyorum. Hoşça kalın.

LINQ query on a DataTable
Is it possible for a 'foreach' loop to have a condition check?
Filtering foreach loops with a where condition vs continue guard clauses


Hiç yorum yok:

Yorum Gönder