C # / Linq: Menerapkan fungsi pemetaan ke setiap elemen di IEnumerable?


107

Saya telah mencari cara untuk mengubah setiap elemen dari IEnumerable menjadi sesuatu yang lain menggunakan fungsi pemetaan (dengan cara yang kompatibel dengan Linq) tetapi saya belum menemukan apa pun.

Untuk contoh (sangat sederhana), itu harus bisa melakukan sesuatu seperti

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 };
IEnumerable<string> strings = integers.Transform(i => i.ToString());

Tapi saya belum menemukan apa pun. Maksud saya, cukup mudah untuk menulis metode ekstensi yang menyelesaikannya (pada dasarnya, yang diperlukan hanyalah membungkus enumerator sumber ke dalam kelas baru dan kemudian menulis sedikit kode boilerplate untuk mendelegasikan panggilan ke sana), tetapi saya akan mengharapkannya ini menjadi operasi yang cukup mendasar, dan menulisnya sendiri terasa seperti menemukan kembali roda - Saya tidak dapat menghilangkan perasaan bahwa mungkin ada cara bawaan yang harus saya gunakan, dan saya terlalu buta untuk melihat Itu.

Jadi ... apakah ada sesuatu di Linq yang memungkinkan saya melakukan apa yang saya jelaskan di atas?


Jawaban:


172

Anda bisa menggunakan Select()metode ekstensi:

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 };
IEnumerable<string> strings = integers.Select(i => i.ToString());

Atau dalam sintaks LINQ:

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 };

var strings = from i in integers
              select i.ToString();

4
Ah! Saya tahu pasti ada jalan. Sedikit dari "Masalah Oklusi Visual Hutan / Pohon", saya rasa :)
Andreas Baus

2
Ketahuilah bahwa jika peta Anda memiliki efek samping, Anda mungkin mengalami masalah karena isi peta Select()belum tentu dieksekusi hingga disebutkan. Bukan ide yang bagus untuk melakukan itu, tetapi mungkin ada beberapa situasi di mana Anda mungkin perlu menambahkan ToList()untuk memaksanya mengevaluasi seluruh daftar.
Dave Nichol

6
Bukankah lebih tepat untuk memanggil satu bentuk 'sintaks kueri linq' dan bentuk lain 'sintaks metode linq'?
Ryan Harmuth

2
Sebenarnya keduanya adalah tipe sintaks Linq, yang pertama disebut sintaks Metode dan yang kedua disebut sintaks Query. Baca lebih lanjut: docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
Machado

27

Anda sedang mencari Selectyang dapat digunakan untuk mengubah \ memproyeksikan urutan input:

IEnumerable<string> strings = integers.Select(i => i.ToString());

9
Agar adil, itu seharusnya cocok dengan SQL (di mana kumpulan istilah terakhir adalah terminologi umum)
éclairevoyant

5
Ini sangat mengganggu. Saya mencoba untuk mempelajari pemrograman fungsional ... tetapi harus melupakan 10 tahun istilah LINQ. Saya butuh panduan terjemahan. Saya heran Google menerjemahkan dapat membantu ...
Damien Sawyer
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.