【问题标题】:C#/Linq: Apply a mapping function to each element in an IEnumerable?C#/Linq:将映射函数应用于 IEnumerable 中的每个元素?
【发布时间】:2011-11-03 11:36:34
【问题描述】:

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

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

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

但我什么也没找到。我的意思是,编写一个扩展方法来实现这一点非常简单(基本上,它所需要的只是将源 Enumerator 包装到一个新类中,然后编写一些样板代码来委派对它的调用),但我会本以为这是一个相当基本的操作,而自己编写它感觉就像重新发明轮子一样——我无法摆脱一种我应该使用的内置方式的感觉,而我只是太盲目了去看看。

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

【问题讨论】:

标签: c# linq


【解决方案1】:

您可以只使用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();

【讨论】:

  • 啊!我知道一定有办法。有点老的“森林/树木视觉遮挡问题”,我猜 :)
  • 请注意,如果您的地图有副作用,您可能会遇到麻烦,因为 Select() 的主体在枚举之前不一定会执行。并不是说这样做是个好主意,但在某些情况下,您可能需要添加 ToList() 以强制它评估整个列表。
  • 将一种形式称为“linq 查询语法”和另一种形式称为“linq 方法语法”不是更正确吗?
  • 其实都是Linq语法类型,第一种叫做Method语法,第二种叫做Query语法。阅读更多:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
【解决方案2】:

您正在寻找可用于转换\投影输入序列的Select

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

【讨论】:

  • 公平地说,它应该匹配 SQL(后一组术语是常用术语)
  • 这很烦人。我正在尝试学习函数式编程......但必须忘记 10 年的 LINQ 术语。我需要翻译指南。我想知道谷歌翻译可以帮助...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
相关资源
最近更新 更多