Latar Belakang
Saya baru-baru ini dalam proses bertahan wawancara teknologi melelahkan untuk posisi yang menggunakan .NET stack, beberapa di antaranya termasuk pertanyaan konyol seperti ini , dan beberapa pertanyaan yang lebih valid. Saya baru-baru ini menemukan masalah yang mungkin valid tetapi saya ingin memastikan dengan komunitas di sini.
Ketika ditanya oleh pewawancara bagaimana saya akan menghitung frekuensi kata-kata dalam dokumen teks dan memberi peringkat hasilnya, saya menjawab bahwa saya akan menghitungnya
- Gunakan objek aliran, letakkan file teks dalam memori sebagai string.
- Pisahkan string menjadi sebuah array pada spasi sambil mengabaikan tanda baca.
- Gunakan LINQ terhadap array ke
.GroupBy()
dan.Count()
, laluOrderBy()
ucapkan hitungan.
Saya salah menjawab karena dua alasan:
- Streaming seluruh file teks ke dalam memori bisa menjadi bencana. Bagaimana jika itu seluruh ensiklopedia? Alih-alih, saya harus mengalirkan satu blok pada satu waktu dan mulai membangun tabel hash.
- LINQ terlalu mahal dan membutuhkan terlalu banyak siklus pemrosesan. Saya seharusnya membangun tabel hash dan, untuk setiap iterasi, hanya menambahkan kata ke tabel hash jika tidak ada dan kemudian menambah itu dihitung.
Alasan pertama tampaknya, well, masuk akal. Tapi yang kedua memberi saya lebih banyak jeda. Saya berpikir bahwa salah satu nilai jual LINQ adalah bahwa ia hanya mengabstraksi operasi tingkat rendah seperti tabel hash tetapi bahwa, di bawah tabir, masih implementasi yang sama.
Pertanyaan
Selain dari beberapa siklus pemrosesan tambahan untuk memanggil metode abstrak apa pun, apakah LINQ membutuhkan siklus pemrosesan yang lebih signifikan untuk menyelesaikan tugas iterasi data yang diberikan daripada tugas tingkat rendah (seperti membuat tabel hash)?