Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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; }
}
Catatan
Anda dapat merujuk ke sumber data umum untuk area ini di artikel Gambaran Umum Operator Kueri Standar .
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
teachershanya difilter untuk guru yang tidak ada dalamteachersToExcludearray. -
teachersToExcludeArray berisiIDnilai untuk semua kepala departemen. - Panggilan untuk
ExceptBymenghasilkan 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
TeacherdanStudentdengan membandingkan nama. - Hanya orang yang ditemukan di kedua array yang ada dalam urutan yang dihasilkan.
- Instans
Studentyang 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
teachersdanstudentsdijalin bersama-sama menggunakan namanya sebagai pemilih kunci. - Nama yang dihasilkan ditulis ke konsol.