2010-05-07 51 views
1

我想寫使用lambda以下如何重寫以下?(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++;    
} 

,但不知何故沒有能夠得到它的工作(編譯時錯誤)

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)'的類型參數。嘗試明確指定類型參數。

需要幫助。

感謝

回答

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

你所得到的錯誤是相當不錯的 - LINQ不知道你會從你的拉姆達返回。 。 。 Sam展示了編譯器如何通過顯式地返回已知類型的東西來找出返回的內容。

未來,請考慮編譯器如何能夠辨別出您試圖從表達式返回的內容。這可以給你一個關於如何以編譯器可以解決的方式形成表達式的線索。

如果您的表達式是明確的,則不需要明確聲明返回,否則需要按照Sam的說明幫助編譯器。

0

該lambda體沒有返回語句,因此錯誤。 Select方法需要Func<TSource, TResult> lambda作爲參數,這是一個函數,它採用與集合類型相同的東西並返回其他值。你必須有一個返回聲明才能工作。

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)) 
);