首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有更清晰的语法来将操作应用于序列的每个元素?

是否有更清晰的语法来将操作应用于序列的每个元素?
EN

Stack Overflow用户
提问于 2008-12-28 18:55:14
回答 7查看 527关注 0票数 2
代码语言:javascript
运行
复制
int z = 1;
double result = Math.Log(z);            //works

然而,尝试用数字数组做同样的事情是行不通的:

代码语言:javascript
运行
复制
int[] z = new [] {1,2,3,4};
double[] result = Math.Log(z);            //Syntax 1 - error CS1503: Argument '1': cannot convert from 'int[]' to 'double'
double[] result = z.Select(p => Log(p)).ToArray();  //Syntax 2 - OK

怎样才能让语法#1起作用?语法#2在我看来是肮脏的。

EN

回答 7

Stack Overflow用户

发布于 2008-12-28 19:31:01

不,没有更干净的方法。语法2使用Select()和一个λ表达式将Math.Log()应用到每个元素,这是在C#中实现这一点的惯用方法。

票数 4
EN

Stack Overflow用户

发布于 2008-12-28 19:47:25

代码语言:javascript
运行
复制
int[] z = new [] {1,2,3,4};
double[] result = Array.ConvertAll(z, p => Log(p));

代码语言:javascript
运行
复制
double Log(int i) { return Math.Log(i); }

int[] z = new[] { 1, 2, 3, 4 };
double[] result = Array.ConvertAll(z, Log);
票数 2
EN

Stack Overflow用户

发布于 2008-12-28 21:25:29

为了完整性,还应该注意到Linq最大的优点之一是扩展它的能力。

如果这个操作是您经常做的事情,那么很可能会使用日志函数来扩展您的IEnumerable,这将是非常简单的

代码语言:javascript
运行
复制
  static class LogExtension
  {
    public static IEnumerable<Double> Log(this IEnumerable<int> list)
    {
      foreach (int i in list)
      {
        yield return Math.Log(i);
      }
    }
  }

然后简单地叫它像这样..。

代码语言:javascript
运行
复制
IEnumerable<Double> logValues = myInts.AsEnumerable().Log();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/396521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档