如何改写以下内容?(C#3.0)

时间:2010-05-07 03:37:25

标签: c#-3.0

我正在尝试编写以下内容

double sum_res = 0.0;
double yhat = 0;
double res = 0;
int n = 0;

for(int i=0;i<x.Count;i++)
{
    yhat = inter + (slp*x[i]);
    res  = yhat - y[i];
    n++;              
}

使用lambda但不知何故无法使其工作(编译时错误)

Enumerable.Range(0, x.Count).Select(i =>
                {
                    yhat = inter + (slp * x[i]);
                    res = yhat - y[i];
                    sum_res += res * res;
                    n++;
                });

错误:无法从用法推断出方法'System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable,System.Func)'的类型参数。请尝试明确指定类型参数。

需要帮助。

由于

4 个答案:

答案 0 :(得分:2)

使用Aggregate代替Select,因为它更贴切地模拟了您真正想要做的事情。

        double sum_res = Enumerable.Range(0, x.Count).Aggregate(0.0, (sum, i) =>
        {
            yhat = inter + (slp * x[i]);
            res = yhat - y[i];
            n++;
            return sum + res * res;
        });

答案 1 :(得分:1)

你得到的错误非常好 - LINQ不知道你将从lambda返回什么。 。 。 Sam展示了编译器如何通过显式返回已知类型的东西来确定返回的内容。

将来,请考虑编译器如何能够辨别出您尝试从表达式返回的内容。这可以为您提供有关如何以编译器可以解决的方式构建表达式的线索。

如果你的表达式是明确的,你不需要显式地声明一个返回,否则你需要像Sam所说的那样帮助编译器。

答案 2 :(得分:1)

我不知道你为什么要递增n,但那真的不属于你。我会选择这样的东西。

double sum_res = Enumerable.Range(0, x.Count).Aggregate(0.0, (sum, i) => 
    sum + Math.Pow((inter + (slp * x[i])) - y[i]), 2.0))
);

答案 3 :(得分:0)

lambda主体没有return语句,因此出错。 Select方法将Func<TSource, TResult> lambda作为参数,该函数采用与集合相同类型的函数并返回其他内容。您必须有一个return语句才能使其正常工作。