8 Kasım 2017 Çarşamba

Linq Select Metodu

Giriş
Select bir projection metodu. Projection metodları bir nesneyi başka bir nesneye döndürürler.

SQL ile Karşılaştırma
SQL terminolojisinde selection satırların seçilmesi, projection ise sütunların seçilmesi anlamına gelir. Linq'te projection için Select kelimesinin kullanılması biraz mizahi olmuş :)

Select metodu - value
Örnek
Şöyle yaparız. Örnek aslında Entity Framework ile ilgili ancak benzer mantık.
var user = context.DbUsers
                  .Where(u => u.u_LoginName == id)
                  .Select(u => new { u.u_Name, u.u_Email })
                  .FirstOrDefault(); // query is executed here

string name = user.u_Name; // user is anonymous object
string email = user.u_Email;
Bu metod şöyle bir SQL üretir.
SELECT TOP 1 u_Name, u_Email FROM DbUsers WHERE u_LoginName = @id
Select metodu - value + index
Select liste için kullanılıyorsa dönüştürülen nesnenin kaçıncı indekste olduğu da bilinebilir.Örnek
Şöyle yaparız. İçinde x harfi geçen ilk nesnenin indeksi bulunur.
var result = logContent.Select((value, index) => new { index, value })
                       .FirstOrDefault(item => item.value.Contains("x"));
Örnek
Şöyle yapaırz. Bir liste Dictionary'e dönüştürülüyor ve her kelimenin kaçıncı konumda olduğu saklanıyor.
var map = words
    .Select((word, index) => new { Word = word, Index = index })
    .ToDictionary(x => x.Word, x => x.Index);
Örnek
Şöyle yaparız. Array büyükten küçüğe doğru sıralanıyor ancak bu sefer her elemanın indeksi döndürülüyor.
var list = new [] {1,3,5,2,7,2};

var indices =
    list
        .Select((n, i) => new { n, i })
        .OrderByDescending(x => x.n)
        .Select(x => x.i)
        .ToArray();
Diğer
1. Select İçinde Değişken Tanımlama
Projection yaparken bazen geçici bir değişken tanımlama gerekebilir. Bu durumda return ile nesneyi dönmek gerekir.
Örnek
Şöyle  yaparız
noneRequiredUserDocuments = docs.Select(x => 
  {
      var src= _storageService.GetFileUrl(x.FileName);
      return new NoneRequiredUserDocument
     {
        StudentDocument = x,
        Src = src,
        ThumbnailImageUrl = ImageHelper.ThumbnailImageUrl(src, 75);
     };
  }).ToList();
2. Select Kendisine Verilen Collection Tipini Bilir
Gerçek linq kodu içindeki select verilen collection tipine göre daha hızlı çalışan algoritmayı seçer. Aşağıda mantığı gösteren bir kod görülebilir.
public static IEnumerable<TResult> CustomSelect<TSource, TResult>(
    this IEnumerable<TSource> source, Func<TSource, TResult> selector)
{
    if (source is List<TSource>)
        return CustomSelectList((List<TSource>)source, selector);
    return CustomSelectDefault(source, selector);
}
private static IEnumerable<TResult> CustomSelectList<TSource, TResult>(
    List<TSource> source, Func<TSource, TResult> selector)
{
    foreach (TSource item in source)
    {
        yield return selector(item);
    }
}
private static IEnumerable<TResult> CustomSelectDefault<TSource, TResult>(
    IEnumerable<TSource> source, Func<TSource, TResult> selector)
{
    foreach (TSource item in source)
    {
        yield return selector(item);
    }
}

Hiç yorum yok:

Yorum Gönder