Cara Tercepat untuk Menemukan Item Umum di Beberapa Daftar di C#

Saat bekerja dengan koleksi di C#, Anda mungkin sering menemui situasi di mana Anda perlu menemukan elemen yang umum di beberapa daftar. Ini sangat berguna ketika Anda ingin memfilter hasil berdasarkan kriteria tertentu. Dalam posting blog ini, kita akan membahas skenario umum: bagaimana cara cepat mengidentifikasi subset dari objek Option yang muncul di setiap daftar dalam daftar daftar.

Pernyataan Masalah

Bayangkan Anda memiliki daftar daftar, khususnya suatu struktur seperti List<List<Option>> optionLists. Anda perlu menentukan objek Option mana yang ada di semua N daftar. Untuk menyelesaikan ini, kita perlu menyadari bahwa kesetaraan objek Option ditentukan oleh properti string tertentu, seperti option1.Value == option2.Value. Pada akhirnya, kita ingin mengembalikan List<Option> di mana setiap item muncul hanya sekali.

Solusi: Menemukan Opsi Umum

Untuk menangani masalah ini, kita dapat memanfaatkan LINQ (Language Integrated Query) di C#. LINQ menyediakan cara yang kuat untuk mengkueri koleksi, menjadikannya ideal untuk kasus penggunaan kita. Berikut adalah potongan kode efektif yang menyelesaikan tugas ini:

var x = from list in optionLists
        from option in list
        where optionLists.All(l => l.Any(o => o.Value == option.Value))
        orderby option.Value
        select option;

Penjelasan Kode

Mari kita uraikan kueri LINQ langkah demi langkah:

  1. Klausul From Luar: Bagian pertama from list in optionLists mengiterasi setiap daftar dalam daftar utama kita (optionLists).

  2. Klausul From Dalam: Bagian kedua from option in list mengakses setiap Option dalam daftar saat ini.

  3. Klausul Where: Ini adalah bagian penting dari solusi:

    • Kondisi where optionLists.All(l => l.Any(o => o.Value == option.Value)) memeriksa apakah option saat ini ditemukan di semua daftar dalam optionLists.
    • Metode Any memeriksa apakah ada Option o di daftar saat ini l di mana Value cocok dengan Value dari option saat ini.
  4. Pengurutan Hasil: Klausul orderby option.Value mengurutkan objek Option yang dihasilkan berdasarkan Value mereka.

  5. Klausul Select: Terakhir, select option mengumpulkan semua opsi yang memenuhi syarat ke dalam sebuah koleksi.

Pertimbangan Penting

  • Nilai Distinct: Kode yang diberikan tidak menyertakan pilihan distinct, yang berarti ia dapat mengembalikan beberapa objek Option dengan Value yang sama. Jika Anda memerlukan Options yang unik, pertimbangkan untuk menambahkan .Distinct() ke kueri Anda.

  • Performa: Tergantung pada ukuran daftar Anda, efisiensi pendekatan ini sangat signifikan. Kueri LINQ dioptimalkan dan dapat berkinerja baik dengan dataset berukuran sedang.

Kesimpulan

Menemukan item umum di beberapa daftar dapat dicapai dengan efisien di C# menggunakan LINQ, seperti yang diilustrasikan dalam contoh kita. Dengan memanfaatkan kekuatan LINQ, kita dapat melakukan kueri kompleks dengan usaha pengkodean minimal. Ini tidak hanya mempercepat proses pengkodean Anda tetapi juga meningkatkan keterbacaan dan pemeliharaan kode Anda.

Sekarang Anda sudah dilengkapi dengan pengetahuan ini, Anda dapat dengan mudah menerapkan solusi semacam itu dalam proyek Anda, menjadikan penanganan koleksi Anda lebih sederhana dan lebih efisien.