İşlemleri ayarlama (C#)

LINQ'teki ayarlama işlemleri, aynı veya ayrı koleksiyonlardaki eşdeğer öğelerin varlığına veya yokluğuna bağlı olarak bir sonuç kümesi oluşturan sorgu işlemlerine başvurur.

Önemli

Bu örnekler bir System.Collections.Generic.IEnumerable<T> veri kaynağı kullanır. Veri kaynaklarını ve ifade ağaçlarını System.Linq.IQueryProviderkullanan System.Linq.IQueryable<T> veri kaynakları. İfade ağaçlarının izin verilen C# söz diziminde sınırlamaları vardır. Ayrıca EF Core gibi her IQueryProvider veri kaynağı daha fazla kısıtlama uygulayabilir. Veri kaynağınızın belgelerine bakın.

Yöntem adları Açıklama C# sorgu ifadesi söz dizimi Daha Fazla Bilgi
Distinct veya DistinctBy Bir koleksiyondan yinelenen değerleri kaldırır. Uygulanamaz. Enumerable.Distinct
Enumerable.DistinctBy
Queryable.Distinct
Queryable.DistinctBy
Except veya ExceptBy Küme farkını döndürür; bu, ikinci bir koleksiyonda görünmeyen bir koleksiyonun öğeleri anlamına gelir. Uygulanamaz. Enumerable.Except
Enumerable.ExceptBy
Queryable.Except
Queryable.ExceptBy
Intersect veya IntersectBy İki koleksiyonun her birinde görünen öğeler anlamına gelen küme kesişimini döndürür. Uygulanamaz. Enumerable.Intersect
Enumerable.IntersectBy
Queryable.Intersect
Queryable.IntersectBy
Union veya UnionBy İki koleksiyondan birinde görünen benzersiz öğeler anlamına gelen küme birleşimini döndürür. Uygulanamaz. Enumerable.Union
Enumerable.UnionBy
Queryable.Union
Queryable.UnionBy

Distinct ve DistinctBy

Aşağıdaki örnekte, yönteminin Enumerable.Distinct bir dizi dizedeki davranışı gösterilir. Döndürülen dizi, giriş dizisinden benzersiz öğeleri içerir.

Distinct() davranışını gösteren grafik

string[] words = ["the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"];

IEnumerable<string> query = from word in words.Distinct()
                            select word;

foreach (var str in query)
{
    Console.WriteLine(str);
}

/* This code produces the following output:
 *
 * the
 * quick
 * brown
 * fox
 * jumped
 * over
 * lazy
 * dog
 */

DistinctBy, bir alan için Distinct alternatif bir keySelectoryaklaşımdır. keySelector, kaynak türünün karşılaştırmalı ayırıcısı olarak kullanılır. Aşağıdaki kodda, sözcükler kendilerine Lengthgöre ayrımcılığa uğratır ve her uzunluğun ilk sözcüğü görüntülenir:

string[] words = ["the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"];

foreach (string word in words.DistinctBy(p => p.Length))
{
    Console.WriteLine(word);
}

// This code produces the following output:
//     the
//     quick
//     jumped
//     over

Except ve ExceptBy

Aşağıdaki örnekte davranışının gösterimi verilmiştir Enumerable.Except. Döndürülen dizi yalnızca ikinci giriş dizisinde olmayan ilk giriş dizisindeki öğeleri içerir.

Except() eylemini gösteren grafik

Not

Bu makaledeki aşağıdaki örneklerde bu alan için ortak veri kaynakları kullanılır.
Her Student birinin bir not düzeyi, bir birincil bölüm ve bir dizi puanı vardır. Ayrıca, Teacher öğretmenin ders aldığı kampüsü tanımlayan bir City özelliği de vardır. A'nın Department bir adı ve bölüm başkanı olarak görev yapan bir Teacher kişi için bir referansı vardır.
Örnek veri kümesini kaynak depoda bulabilirsiniz.

public enum GradeLevel
{
    FirstYear = 1,
    SecondYear,
    ThirdYear,
    FourthYear
};

public class Student
{
    public required string FirstName { get; init; }
    public required string LastName { get; init; }
    public required int ID { get; init; }

    public required GradeLevel Year { get; init; }
    public required List<int> Scores { get; init; }

    public required int DepartmentID { get; init; }
}

public class Teacher
{
    public required string First { get; init; }
    public required string Last { get; init; }
    public required int ID { get; init; }
    public required string City { get; init; }
}

public class Department
{
    public required string Name { get; init; }
    public int ID { get; init; }

    public required int TeacherID { get; init; }
}
string[] words1 = ["the", "quick", "brown", "fox"];
string[] words2 = ["jumped", "over", "the", "lazy", "dog"];

IEnumerable<string> query = from word in words1.Except(words2)
                            select word;

foreach (var str in query)
{
    Console.WriteLine(str);
}

/* This code produces the following output:
 *
 * quick
 * brown
 * fox
 */

ExceptBy yöntemi, muhtemelen heterojen türlerden oluşan iki dizi ve bir alan için alternatif bir keySelectoryaklaşımdırExcept. keySelector, ilk koleksiyonun türüyle aynı türdür. Dışlamak için aşağıdaki Teacher diziyi ve öğretmen kimliklerini göz önünde bulundurun. İkinci koleksiyonda olmayan ilk koleksiyondaki öğretmenleri bulmak için öğretmenin kimliğini ikinci koleksiyona yansıtabilirsiniz:

int[] teachersToExclude =
[
    901,    // English
    965,    // Mathematics
    932,    // Engineering
    945,    // Economics
    987,    // Physics
    901     // Chemistry
];

foreach (Teacher teacher in
    teachers.ExceptBy(
        teachersToExclude, teacher => teacher.ID))
{
    Console.WriteLine($"{teacher.First} {teacher.Last}");
}

Yukarıdaki C# kodunda:

  • Dizi teachers , yalnızca dizide teachersToExclude olmayan öğretmenlere göre filtrelenmiştir.
  • Dizi, teachersToExclude tüm departman başlarının ID değerini içerir.
  • çağrısı, konsola ExceptBy yazılan yeni bir değer kümesiyle sonuçlanıyor.

Yeni değer Teacherkümesi, ilk koleksiyonun türü olan türündedir. Dizide teachers karşılık gelen bir kimlik değeri olmayan dizideki teachersToExclude her teacher biri konsola yazılır.

Intersect ve IntersectBy

Aşağıdaki örnekte davranışının gösterimi verilmiştir Enumerable.Intersect. Döndürülen dizi, her iki giriş dizisi için de ortak olan öğeleri içerir.

İki sıranın kesişimini gösteren grafik

string[] words1 = ["the", "quick", "brown", "fox"];
string[] words2 = ["jumped", "over", "the", "lazy", "dog"];

IEnumerable<string> query = from word in words1.Intersect(words2)
                            select word;

foreach (var str in query)
{
    Console.WriteLine(str);
}

/* This code produces the following output:
 *
 * the
 */

IntersectBy yöntemi, muhtemelen heterojen türlerden oluşan iki dizi ve bir alan için alternatif bir keySelectoryaklaşımdırIntersect. keySelector, ikinci koleksiyonun türünün karşılaştırmalı ayırıcısı olarak kullanılır. Aşağıdaki öğrenci ve öğretmen dizilerini göz önünde bulundurun. Sorgu, aynı zamanda öğretmen olan öğrencileri bulmak için her dizideki öğeleri ada göre eşleştirir:

foreach (Student person in
    students.IntersectBy(
        teachers.Select(t => (t.First, t.Last)), s => (s.FirstName, s.LastName)))
{
    Console.WriteLine($"{person.FirstName} {person.LastName}");
}

Yukarıdaki C# kodunda:

  • Sorgu, adları karşılaştırarak ve'nin Student kesişimini Teacher oluşturur.
  • Sonuçta elde edilen dizide yalnızca her iki dizide bulunan kişiler bulunur.
  • Sonuçta elde edilen Student örnekler konsola yazılır.

Union ve UnionBy

Aşağıdaki örnekte iki dize dizisinde birleşim işlemi verilmiştir. Döndürülen dizi, her iki giriş dizisinden de benzersiz öğeleri içerir.

İki sıranın birleşimini gösteren grafik.

string[] words1 = ["the", "quick", "brown", "fox"];
string[] words2 = ["jumped", "over", "the", "lazy", "dog"];

IEnumerable<string> query = from word in words1.Union(words2)
                            select word;

foreach (var str in query)
{
    Console.WriteLine(str);
}

/* This code produces the following output:
 *
 * the
 * quick
 * brown
 * fox
 * jumped
 * over
 * lazy
 * dog
*/

yöntemi, UnionBy aynı türde ve bir olmak üzere Union iki dizi alan alternatif bir keySelectoryaklaşımdır. keySelector, kaynak türünün karşılaştırmalı ayırıcısı olarak kullanılır. Aşağıdaki sorgu, öğrenci veya öğretmen olan tüm kişilerin listesini oluşturur. Aynı zamanda öğretmen olan öğrenciler, sendika kümesine yalnızca bir kez eklenir:

foreach (var person in
    students.Select(s => (s.FirstName, s.LastName)).UnionBy(
        teachers.Select(t => (FirstName: t.First, LastName: t.Last)), s => (s.FirstName, s.LastName)))
{
    Console.WriteLine($"{person.FirstName} {person.LastName}");
}

Yukarıdaki C# kodunda:

  • teachers ve students dizileri, anahtar seçici olarak adları kullanılarak birlikte örülmüştür.
  • Sonuçta elde edilen adlar konsola yazılır.

Ayrıca bkz.