2011-08-02 6 views
0

람다 식에서 호출하는 메서드에 중단 점을 넣을 때 중단 점이 결코 적중되지 않습니다. 메서드 호출을 람다 외부로 옮기면 중단 점이 발생합니다. 예를 들어메서드가 람다에서 호출 될 때 중단 점이 발생하지 않습니다

:

Function IncrementAll(ByVal items As IEnumerable(Of Integer)) As IEnumerable(Of Integer) 
    Return items.Select(Function(i) Increment(i)) 
End Function 

Function Increment(ByVal i As Integer) As Integer 
    Return i + 1 'Breakpoint here 
End Function 

내가 IncrementAll를 호출 할 경우, 증가에 중단 점 적중되지 않습니다. VS 2008을 이러한 중단 점에서 중지시키는 방법이 있습니까? 디버깅을 위해 모든 LINQ를 루프로 다시 작성한다는 생각이 싫다.

+0

흥미 롭다. .NET에서이 작업을 수행했다는 것을 알고있다. 4. "items"에 요소가 있고 디버그 구성에서 실행 중이라는 것을 확인했다. (즉, 중단 점은 프로젝트의 다른 곳에 적용될 것이다.)? –

+0

네, items.Select에 중단 점을 넣으면 위를 치고, Items.Select를 루프로 바꾸면 Increment의 중단 점에 도달합니다. – Misko

답변

2

그래서 알아 냈습니다. Select는 IEnumerable을 반환하고 IEnumerable의 항목에 액세스하려고 시도 할 때까지 각 항목에서 Increment가 실제로 실행됩니다. 원하는 효과를 얻을 수있는 가장 빠른 방법이 될 것이다 :

Function IncrementAll(ByVal items As IEnumerable(Of Integer)) As IEnumerable(Of Integer) 
    Return items.Select(Function(i) Increment(i)).ToList() 
End Function 

ToList() 즉시 따라서 각 요소에 대해 증가를 실행, 열거하고 브레이크 포인트가 발생합니다.

+0

그게 전부 였어. 브레이크 포인트가 작동하고 있었지만, 그렇게 생각한 후에는 브레이크 포인트가 오래 걸렸을뿐입니다. 감사 :) – Misko

관련 문제