int z = 1;
double result = Math.Log(z); //works然而,尝试用数字数组做同样的事情是行不通的:
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在我看来是肮脏的。
发布于 2008-12-28 19:31:01
不,没有更干净的方法。语法2使用Select()和一个λ表达式将Math.Log()应用到每个元素,这是在C#中实现这一点的惯用方法。
发布于 2008-12-28 19:47:25
int[] z = new [] {1,2,3,4};
double[] result = Array.ConvertAll(z, p => Log(p));或
double Log(int i) { return Math.Log(i); }
int[] z = new[] { 1, 2, 3, 4 };
double[] result = Array.ConvertAll(z, Log);发布于 2008-12-28 21:25:29
为了完整性,还应该注意到Linq最大的优点之一是扩展它的能力。
如果这个操作是您经常做的事情,那么很可能会使用日志函数来扩展您的IEnumerable,这将是非常简单的
static class LogExtension
{
public static IEnumerable<Double> Log(this IEnumerable<int> list)
{
foreach (int i in list)
{
yield return Math.Log(i);
}
}
}然后简单地叫它像这样..。
IEnumerable<Double> logValues = myInts.AsEnumerable().Log();https://stackoverflow.com/questions/396521
复制相似问题