LINQ'i Destekleyen C# Özellikleri
Sorgu İfadeleri
Sorgu ifadeleri, koleksiyonları sorgulamak System.Collections.Generic.IEnumerable<T> için SQL veya XQuery'ye benzer bildirim temelli bir söz dizimi kullanır. Derleme zamanında sorgu söz dizimi, LINQ sağlayıcısının standart sorgu yöntemlerini uygulamasına yönelik yöntem çağrılarına dönüştürülür. Uygulamalar, bir using
yönergeyle uygun ad alanını belirterek kapsamdaki standart sorgu işleçlerini denetler. Aşağıdaki sorgu ifadesi bir dizi dize alır, bunları dizedeki ilk karaktere göre gruplandırır ve grupları sıralar.
var query = from str in stringArray
group str by str[0] into stringGroup
orderby stringGroup.Key
select stringGroup;
Örtük Olarak Yazılan Değişkenler (var)
Burada gösterildiği gibi, derleyiciye türü çıkarmasını ve atamasını bildirmek için var değiştiricisini kullanabilirsiniz:
var number = 5;
var name = "Virginia";
var query = from str in stringArray
where str[0] == 'm'
select str;
olarak var
bildirilen değişkenler, türünü açıkça belirttiğiniz değişkenler gibi kesin olarak yazılır. kullanımı var
anonim türler oluşturmayı mümkün kılar, ancak yalnızca yerel değişkenler için. Daha fazla bilgi için bkz . Örtük Olarak Yazılan Yerel Değişkenler.
Nesne ve Koleksiyon Başlatıcıları
Nesne ve koleksiyon başlatıcıları, nesne için bir oluşturucuyu açıkça çağırmadan nesneleri başlatmayı mümkün hale getirir. Başlatıcılar genellikle kaynak verileri yeni bir veri türüne yansıttığında sorgu ifadelerinde kullanılır. public Name
ve Phone
properties ile adlı Customer
bir sınıf varsayıldığında, nesne başlatıcı aşağıdaki kodda olduğu gibi kullanılabilir:
var cust = new Customer { Name = "Mike", Phone = "555-1212" };
Sınıfınıza Customer
devam ederek adlı IncomingOrders
bir veri kaynağı olduğunu ve büyük OrderSize
olan her sipariş için bu sırayı temel alan yeni Customer
bir oluşturmak istediğinizi varsayalım. LinQ sorgusu bu veri kaynağında yürütülebilir ve bir koleksiyonu doldurmak için nesne başlatmayı kullanabilir:
var newLargeOrderCustomers = from o in IncomingOrders
where o.OrderSize > 5
select new Customer { Name = o.Name, Phone = o.Phone };
Veri kaynağı, gibi OrderSize
sınıfından Customer
daha fazla özelliğe sahip olabilir, ancak nesne başlatma ile sorgudan döndürülen veriler istenen veri türüne kalıplanır; sınıfınızla ilgili verileri seçersiniz. Sonuç olarak, artık istediğiniz yenilerle Customer
doldurulmuş olursunuzSystem.Collections.Generic.IEnumerable<T>. Yukarıdaki örnek LINQ yönteminin söz diziminde de yazılabilir:
var newLargeOrderCustomers = IncomingOrders.Where(x => x.OrderSize > 5).Select(y => new Customer { Name = y.Name, Phone = y.Phone });
C# 12 ile başlayarak, bir koleksiyonu başlatmak için bir koleksiyon ifadesi kullanabilirsiniz.
Daha fazla bilgi için bkz.
Anonim Türler
Derleyici anonim bir tür oluşturur. Tür adı yalnızca derleyici tarafından kullanılabilir. Anonim türler, ayrı bir adlandırılmış tür tanımlamak zorunda kalmadan sorgu sonucunda bir özellik kümesini geçici olarak gruplandırmak için kullanışlı bir yol sağlar. Anonim türler, burada gösterildiği gibi yeni bir ifade ve nesne başlatıcı ile başlatılır:
select new {name = cust.Name, phone = cust.Phone};
C# 7 ile başlayarak, adsız türler oluşturmak için tanımlama kümeleri kullanabilirsiniz.
Uzantı Metotları
Uzantı yöntemi bir türle ilişkilendirilebilen statik bir yöntemdir, böylece türdeki bir örnek yöntemiymiş gibi çağrılabilir. Bu özellik, mevcut türlerde değişiklik yapmadan yeni yöntemleri "eklemenizi" sağlar. Standart sorgu işleçleri, uygulayan her tür için LINQ sorgu işlevselliği sağlayan bir uzantı yöntemleri kümesidir IEnumerable<T>.
Lambda İfadeleri
Lambda ifadeleri, giriş parametrelerini işlev gövdesinden ayırmak için işlecini =>
kullanan ve derleme zamanında temsilciye veya ifade ağacına dönüştürülebilen bir satır içi işlevdir. LINQ programlamada, standart sorgu işleçlerine doğrudan yöntem çağrıları yaptığınızda lambda ifadeleriyle karşılaşırsınız.
Veri olarak ifadeler
Sorgu nesneleri birleştirilebilir, yani bir yöntemden sorgu döndürebilirsiniz. Sorguları temsil eden nesneler, sonuçta elde edilen koleksiyonu değil, gerektiğinde sonuçları üretme adımlarını depolar. Yöntemlerden sorgu nesnelerini döndürmenin avantajı, daha fazla oluşturulabilmesi veya değiştirilmeleridir. Bu nedenle, sorgu döndüren bir yöntemin herhangi bir dönüş değeri veya out
parametresi de bu türe sahip olmalıdır. Bir yöntem sorguyu somut List<T> bir türe veya Array türe dönüştürüyorsa, sorgunun kendisi yerine sorgu sonuçlarını döndürür. Bir yöntemden döndürülen sorgu değişkeni yine de oluşturulabilir veya değiştirilebilir.
Aşağıdaki örnekte, ilk yöntem QueryMethod1
bir sorguyu dönüş değeri olarak, ikinci yöntem QueryMethod2
ise bir sorguyu parametre olarak out
döndürür (returnQ
örnekte). Her iki durumda da, sorgu sonuçları değil döndürülen bir sorgudur.
IEnumerable<string> QueryMethod1(int[] ints) =>
from i in ints
where i > 4
select i.ToString();
void QueryMethod2(int[] ints, out IEnumerable<string> returnQ) =>
returnQ =
from i in ints
where i < 4
select i.ToString();
int[] nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var myQuery1 = QueryMethod1(nums);
Sorgu myQuery1
aşağıdaki foreach döngüsünde yürütülür.
foreach (var s in myQuery1)
{
Console.WriteLine(s);
}
Türünü görmek için fare işaretçisini üzerine myQuery1
getirin.
Ayrıca, komutunu kullanmadan myQuery1
doğrudan öğesinden QueryMethod1
döndürülen sorguyu yürütebilirsiniz.
foreach (var s in QueryMethod1(nums))
{
Console.WriteLine(s);
}
Dönüş türünü görmek için QueryMethod1
fare işaretçisini çağrının üzerinde bekletin.
QueryMethod2
parametresinin out
değeri olarak bir sorgu döndürür:
QueryMethod2(nums, out IEnumerable<string> myQuery2);
// Execute the returned query.
foreach (var s in myQuery2)
{
Console.WriteLine(s);
}
Sorgu oluşturma kullanarak bir sorguyu değiştirebilirsiniz. Bu durumda, yeni bir sorgu nesnesi oluşturmak için önceki sorgu nesnesi kullanılır. Bu yeni nesne, özgün sorgu nesnesinden farklı sonuçlar döndürür.
myQuery1 =
from item in myQuery1
orderby item descending
select item;
// Execute the modified query.
Console.WriteLine("\nResults of executing modified myQuery1:");
foreach (var s in myQuery1)
{
Console.WriteLine(s);
}
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin