Bagikan melalui


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.

Grafik memperlihatkan perilaku Distinct()

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.

Grafik memperlihatkan tindakan Except()

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 dalam teachersToExclude array.
  • teachersToExclude Array berisi ID 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.

Grafik memperlihatkan persimpangan dua urutan

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 dan Student 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.

Grafik memperlihatkan persatuan dua urutan.

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 dan students dijalin bersama-sama menggunakan namanya sebagai pemilih kunci.
  • Nama yang dihasilkan ditulis ke konsol.

Lihat juga