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.
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.
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.
Şöyle yapaırz. Bir liste Dictionary'e dönüştürülüyor ve her kelimenin kaçıncı konumda olduğu saklanıyor.
Şö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.
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.
Şö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ğer1. 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 Bilirpublic 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