2010-05-07 3 views
1

나는 그것이다음? (C# 3.0)

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

(컴파일시 오류) 작업을 얻을 수 없습니다 어떻게 든

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++;    
} 

다음 람다를 사용하지만 쓰기를 시도하고 다시 작성하는 방법 오류 : '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

람다 본문에는 return 문이 없으므로 오류가 발생합니다. Select 메서드는 매개 변수로 Func<TSource, TResult> 람다를 취합니다.이 매개 변수는 컬렉션과 동일한 유형의 것을 가져 와서 다른 것을 반환하는 함수입니다. 이 작업을 수행하려면 return 문이 있어야합니다.

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