C#/ Linq:是否将映射函数应用于IEnumerable中的每个元素?


107

我一直在寻找一种使用映射函数(以与Linq兼容的方式)将IEnumerable的每个元素转换为其他内容的方法,但是我什么都没找到。

对于一个(非常简单的)示例,它应该能够执行以下操作

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

但是我什么都没找到。我的意思是,编写一个扩展方法来完成此任务非常简单(基本上,它所需要的只是将源枚举器包装到一个新类中,然后编写一些样板代码来委派对其的调用),但是我希望这是一个相当基本的操作,我自己编写它就像重新发明轮子一样-我无法撼动自己应该使用内置方法的感觉,而我实在太盲目了它。

那么... Linq中有什么可以让我做上面描述的事情?


Answers:


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
啊! 我知道一定有办法。我猜
有点旧的

2
请注意,如果地图有副作用,则可能会遇到麻烦,因为在Select()枚举之前不一定要执行遗体。这样做并不是一个好主意,但是在某些情况下,可能需要添加ToList()以强制其评估整个列表。
戴夫·尼科尔

6
将一种形式称为“ linq查询语法”而将另一种形式称为“ linq方法语法”不是更正确吗?
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
真烦人。我正在尝试学习函数式编程...但是必须学习10年的LINQ术语。我需要翻译指南。我不知道Google翻译对您有帮助吗?
Damien Sawyer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.