Tek Fotoluk İpucu 120 - Bir Listeden N Sayıda Benzersiz Nesne Çekmek

Merhaba Arkadaşlar,

Vaktiyle zamanında(bugün aslında) çalışmakta olduğumuz projede şöyle bir ihtiyacımız oldu; "Bir Oracle tablosundan Entity Framework aracılığı ile çektiğimiz nesne koleksiyonundan benzersiz olan n sayıdakini elde etmek" Elbette bu işi önce SQL tarafında halledip, sonrasında EF tarafına aktarmayı da tercih edebilirdik. Ancak değerli çalışma arkadaşım ile konuyu tartışırken fikir fikri doğurdu ve ortaya şöyle bir ihtiyaç daha çıktı. "Ya bunu T tipinde elemanlardan oluşan herhangi bir koleksiyon üzerinde, herhangi bir kritere göre yaptırmak istesek..."

İşte bu noktada aklımıza aşağıdaki gibi bir çözüm geldi. 


Kodu kısaca incelediğinizde tahmin edeceğiniz üzere en kritik noktalardan birisi Randomizer sınıfının GetRandomList metoduna bool sonuç döndürüp T tipinden değer alan Func temsilcisi tipinden bir referans geçirilmesi. 

Bu sayede sorgu koşulunu(örneğin sadece iki numaralı kategoriyi baz al, ya da her zaman doğru olacak bir kriteri göndererek tüm listeyi değerlendir) yine metoda gelen T türündeki IEnumerable arayüzü(Interface) türevli koleksiyon üzerinde uygulayabiliyoruz. Metod içerisinde ise aynı elemanları tekrar tekrar almamak için basit bir çözüm söz konusu. Çok daha iyi bir çözüm olabileceğinden eminim. Bazı hata ürtebilecek durumlar kontrol edilmeye çalışıldı. (Örneğin n değerinin koşula uygun elemanların toplam sayısının yarısından yüksek olmaması vb.) 

Kısacası uygulanan çözüm yolu için değerli yorumlarınızı eksik etmeyiniz ifinim. Bir başka ipucunda görüşünceye dek hepinize mutlu günler dilerim.

Yorumlar (2) -

  • Merhabalar,
    İhtiyaçtan verinin Random eşsiz olduğu anlamındaki çıkartamadım. Bu nedenle Random kullanımını çıkartmak daha doğru olabilir. Şöyleki kriter gibi bir de selector ya da key selector gibi bir parametre daha kullanıp veriy sıralı gezerek her objenin sadece key ini kontrol edip eklemek daha doğru olabilir. Key leri de hash üzerinde tutmak daha faydalı olabilir. Bir de eğer Random gezme ihtiyacı varsa muhtemelen farklı gezme ihtiyaçları da olabilir. Bunun içinde ienumerable dan bir sonraki nesneyi dönecek başka bir func daha metota eklenebilir. Eğer bu konuda yanılıyorsam lütfen beni aydınlatın Smile

    Elinize sağlık

    Diğer taraftan ienumerable tipindeki arayüzden linq ile element at ya da where gibi işlevlerindeki kullanılması her seferinde baştan tüm nesnelerin gezilmesine sebep olabilir.
  • Yorumu editlerken hata yapmışım. İlk paragrafın son cümlesi ve iyi dileklerim ikinci paragrafın sonunda olmalıydı Smile

Yorum ekle

Loading