Operasi kumpulan (C#)
Atur operasi di LINQ mengacu pada operasi kueri yang menghasilkan tataan hasil berdasarkan keberadaan atau tidak adanya elemen yang setara dalam koleksi yang sama atau terpisah.
Penting
Sampel ini menggunakan System.Collections.Generic.IEnumerable<T> sumber data. Sumber data berdasarkan System.Linq.IQueryProvider penggunaan System.Linq.IQueryable<T> sumber data dan pohon ekspresi. Pohon ekspresi memiliki batasan pada sintaks C# yang diizinkan. Selain itu, setiap IQueryProvider
sumber data, seperti EF Core dapat memberlakukan lebih banyak batasan. Periksa dokumentasi untuk sumber data Anda.
Nama metode | Deskripsi | Sintaks ekspresi kueri C# | Informasi selengkapnya |
---|---|---|---|
Distinct atau DistinctBy |
Menghapus nilai duplikat dari koleksi. | Tidak berlaku. | Enumerable.Distinct Enumerable.DistinctBy Queryable.Distinct Queryable.DistinctBy |
Except atau ExceptBy |
Mengembalikan perbedaan yang ditetapkan, yang berarti elemen dari satu koleksi yang tidak muncul dalam koleksi kedua. | Tidak berlaku. | Enumerable.Except Enumerable.ExceptBy Queryable.Except Queryable.ExceptBy |
Intersect atau IntersectBy |
Mengembalikan persimpangan kumpulan, yang berarti elemen yang muncul di masing-masing dari dua koleksi. | Tidak berlaku. | Enumerable.Intersect Enumerable.IntersectBy Queryable.Intersect Queryable.IntersectBy |
Union atau UnionBy |
Mengembalikan gabungan kumpulan, yang berarti elemen unik yang muncul di salah satu dari dua koleksi. | Tidak berlaku. | Enumerable.Union Enumerable.UnionBy Queryable.Union Queryable.UnionBy |
Distinct
dan DistinctBy
Contoh berikut menggambarkan perilaku metode Enumerable.Distinct pada urutan string. Urutan yang dikembalikan berisi elemen unik dari urutan input.
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
adalah pendekatan alternatif untuk Distinct
yang menggunakan keySelector
. keySelector
digunakan sebagai pembeda komparatif dari jenis sumber. Dalam kode berikut, kata-kata didiskriminasi berdasarkan Length
, dan kata pertama dari setiap panjang ditampilkan:
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
dan ExceptBy
Contoh berikut menggambarkan perilaku Enumerable.Except. Urutan yang dikembalikan hanya berisi elemen dari urutan input pertama yang tidak berada dalam urutan input kedua.
Catatan
Contoh berikut dalam artikel ini menggunakan sumber data umum untuk area ini.
Masing-masing Student
memiliki tingkat kelas, departemen utama, dan serangkaian skor. A Teacher
juga memiliki City
properti yang mengidentifikasi kampus tempat guru mengadakan kelas. A Department
memiliki nama, dan referensi untuk siapa Teacher
yang menjabat sebagai kepala departemen.
Anda dapat menemukan contoh himpunan data di repositori sumber.
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
*/
Metode ExceptBy adalah pendekatan alternatif untuk Except
yang mengambil dua urutan jenis yang mungkin heterogen dan keySelector
. adalah keySelector
jenis yang sama dengan jenis koleksi pertama. Pertimbangkan array dan ID guru berikut Teacher
untuk dikecualikan. Untuk menemukan guru dalam koleksi pertama yang tidak ada di koleksi kedua, Anda dapat memproyeksikan ID guru ke koleksi kedua:
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}");
}
Dalam kode C# sebelumnya:
- Array
teachers
hanya difilter untuk guru yang tidak ada dalamteachersToExclude
array. teachersToExclude
Array berisiID
nilai untuk semua kepala departemen.- Panggilan untuk
ExceptBy
menghasilkan serangkaian nilai baru yang ditulis ke konsol.
Kumpulan nilai baru berjenis Teacher
, yang merupakan jenis koleksi pertama. Masing-masing teacher
dalam teachers
array yang tidak memiliki nilai ID yang sesuai dalam teachersToExclude
array ditulis ke konsol.
Intersect
dan IntersectBy
Contoh berikut menggambarkan perilaku Enumerable.Intersect. Urutan yang dikembalikan berisi elemen-elemen yang umum untuk kedua urutan input.
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
*/
Metode IntersectBy adalah pendekatan alternatif untuk Intersect
yang mengambil dua urutan jenis yang mungkin heterogen dan keySelector
. keySelector
digunakan sebagai pembeda komparatif dari jenis koleksi kedua. Pertimbangkan array siswa dan guru berikut. Kueri cocok dengan item di setiap urutan berdasarkan nama untuk menemukan siswa yang juga merupakan guru:
foreach (Student person in
students.IntersectBy(
teachers.Select(t => (t.First, t.Last)), s => (s.FirstName, s.LastName)))
{
Console.WriteLine($"{person.FirstName} {person.LastName}");
}
Dalam kode C# sebelumnya:
- Kueri menghasilkan persimpangan
Teacher
danStudent
dengan membandingkan nama. - Hanya orang yang ditemukan di kedua array yang ada dalam urutan yang dihasilkan.
- Instans
Student
yang dihasilkan ditulis ke konsol.
Union
dan UnionBy
Contoh berikut menggambarkan operasi gabungan pada dua urutan string. Urutan yang dikembalikan berisi elemen unik dari kedua urutan input.
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
*/
Metode UnionBy adalah pendekatan alternatif untuk Union
yang mengambil dua urutan dengan jenis yang sama dan keySelector
. keySelector
digunakan sebagai pembeda komparatif dari jenis sumber. Kueri berikut menghasilkan daftar semua orang yang merupakan siswa atau guru. Siswa yang juga guru ditambahkan ke kumpulan serikat hanya sekali:
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}");
}
Dalam kode C# sebelumnya:
- Array
teachers
danstudents
dijalin bersama-sama menggunakan namanya sebagai pemilih kunci. - Nama yang dihasilkan ditulis ke konsol.