İş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.
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 keySelector
yaklaşı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 Length
gö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.
Bu makaledeki aşağıdaki örneklerde bu alan için ortak veri kaynakları kullanılır:
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; }
}
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.
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 keySelector
yaklaşı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 dizideteachersToExclude
olmayan öğretmenlere göre filtrelenmiştir. - Dizi,
teachersToExclude
tüm departman başlarınınID
değerini içerir. - çağrısı, konsola
ExceptBy
yazılan yeni bir değer kümesiyle sonuçlanıyor.
Yeni değer Teacher
kü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.
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 keySelector
yaklaşı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 olmayan öğ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şiminiTeacher
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.
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 keySelector
yaklaşı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
vestudents
dizileri, anahtar seçici olarak adları kullanılarak birlikte örülmüştür.- Sonuçta elde edilen adlar konsola yazılır.