Aracılığıyla paylaş


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)

var değiştiricisini kullanarak derleyiciye türü çıkarmasını ve atamasını bildirebilirsiniz, burada gösterildiği gibi:

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 Örtük Olarak Yazılan Yerel Değişkenler bölümüne bakın.

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 Customer ve Name properties ile adlı Phone 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ız Customer ile devam ederken, IncomingOrders adlı bir veri kaynağı olduğunu ve büyük OrderSize olan her bir sipariş için, o siparişe dayanarak yeni bir Customer 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 Customersınıfından OrderSize 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 yeni System.Collections.Generic.IEnumerable<T>lerle dolu bir Customerye sahipsiniz. 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 bakınız:

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, IEnumerable<T>'yı her türde uygulayan LINQ sorgu işlevselliği sağlayan uzantı yöntemleri kümesidir.

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 döndürülen, sorgu sonuçları değil, bizzat sorgunun kendisidir.

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 myQuery1 üzerinde fare işaretçisini bekletin.

Ayrıca, QueryMethod1 kullanılmadan, myQuery1 öğesinden döndürülen sorguyu doğrudan yürütebilirsiniz.

foreach (var s in QueryMethod1(nums))
{
    Console.WriteLine(s);
}

Çağrının dönüş türünü görmek için fare işaretçisini QueryMethod1 ü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);
}