C # / Linq: ใช้ฟังก์ชันการแมปกับแต่ละองค์ประกอบใน IEnumerable?


107

ฉันกำลังมองหาวิธีเปลี่ยนองค์ประกอบแต่ละส่วนของ IE ที่ไม่สามารถคำนวณได้ให้เป็นอย่างอื่นโดยใช้ฟังก์ชันการทำแผนที่ (ในวิธีที่เข้ากันได้กับ Linq) แต่ฉันไม่พบอะไรเลย

สำหรับตัวอย่าง (ง่ายมาก) มันควรจะทำได้เช่น

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

แต่ฉันไม่พบอะไรเลย ฉันหมายความว่ามันค่อนข้างตรงไปตรงมาที่จะเขียนวิธีการขยายที่ทำได้สำเร็จ (โดยพื้นฐานแล้วสิ่งที่ต้องมีก็คือการรวมตัวระบุแหล่งที่มาลงในคลาสใหม่จากนั้นเขียนโค้ดสำเร็จรูปเล็กน้อยเพื่อมอบหมายการโทร) แต่ฉันคาดหวังไว้ นี่เป็นการดำเนินการขั้นต้นพอสมควรและการเขียนมันเองให้ความรู้สึกเหมือนสร้างวงล้อขึ้นมาใหม่ - ฉันไม่สามารถเขย่าความรู้สึกว่าอาจมีวิธีในตัวที่ฉันควรใช้และฉันก็ตาบอดเกินไปที่จะมองเห็น มัน.

มีอะไรใน Linq ที่อนุญาตให้ฉันทำตามที่อธิบายไว้ข้างต้นหรือไม่?


1
อาจเกี่ยวข้อง: ฟังก์ชันแผนที่เทียบเท่า C # ใน Haskellคืออะไร

คำตอบ:


172

คุณสามารถใช้Select()วิธีการขยาย:

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

หรือในไวยากรณ์ LINQ:

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

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

4
อา! ฉันรู้ว่ามันต้องมีทาง "ปัญหาการบดบังภาพป่า / ต้นไม้" แบบเก่าฉันเดาว่า :)
Andreas Baus

2
โปรดทราบว่าหากแผนที่ของคุณมีผลข้างเคียงคุณอาจประสบปัญหาเนื่องจากร่างกายของแผนที่Select()ไม่จำเป็นต้องถูกดำเนินการจนกว่าจะมีการแจกแจง ไม่ใช่ว่าเป็นความคิดที่ดีที่จะทำเช่นนั้น แต่อาจมีบางสถานการณ์ที่คุณอาจต้องเพิ่มToList()เพื่อบังคับให้ประเมินรายการทั้งหมด
Dave Nichol

6
การเรียกรูปแบบหนึ่ง 'linq query syntax' และรูปแบบอื่น ๆ 'linq method syntax' ไม่ถูกต้องหรือไม่?
Ryan Harmuth

2
จริงๆแล้วทั้งสองเป็นประเภทไวยากรณ์ Linq ชนิดแรกเรียกว่าไวยากรณ์ของวิธีการและแบบที่สองเรียกว่าไวยากรณ์การสืบค้น อ่านเพิ่มเติม: docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
Machado

27

คุณกำลังมองหาSelectสิ่งที่สามารถใช้ในการแปลง \ โครงการลำดับการป้อนข้อมูล:

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

9
เพื่อความเป็นธรรมมันควรจะตรงกับ SQL (โดยที่คำศัพท์ชุดหลังเป็นคำศัพท์ทั่วไป)
éclairevoyant

5
ค่อนข้างน่ารำคาญ ฉันกำลังพยายามเรียนรู้การเขียนโปรแกรมเชิงฟังก์ชัน ... แต่ต้องเรียนรู้เงื่อนไข LINQ 10 ปี ฉันต้องการคู่มือการแปล ฉันสงสัยว่า Google translate จะช่วยได้ ...
Damien Sawyer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.