2011-05-16 3 views
13

VB.NET에서 LINQ ForEach 확장을 사용하여 고전적인 For Each 루프를 대체하려고합니다 ...VB.NET에서 익명 메서드를 사용하여 LINQ의 ForEach 사용

 Dim singles As New List(Of Single)(someSingleList) 
    Dim integers As New List(Of Integer) 

    For Each singleValue In singles 
    integers.Add(CInt(Math.Round(singleValue))) 
    Next singleValue 

아마도 이런 식으로 뭔가?

 singles.ForEach(Function(s As [Single]) Do ??? 

익명 메소드 (예 : 새 함수를 선언하지 않고)를 사용하여 올바르게 수행하려면 어떻게해야합니까?

답변

18

이 시도 : 당신의 For Each 루프의 몸 값을 반환하지 않기 때문에

singles.ForEach(Sub(s As [Single]) integers.Add(CInt(Math.Round(s)))) 

당신은 여기에 Sub이 필요합니다.

1

인라인식이 값을 반환 할 것으로 예상되는 경우 함수를 사용합니다. 예를 들어 :

Dim myProduct = repository.Products.First(Function(p) p.Id = 1) 

이는 부울로 평가 뭔가 때문에, 함수 표현식을 사용 (p.Id = 1) 것입니다.

당신은 표현에서 반환되는 아무것도 없기 때문에 하위를 사용해야합니다 :

singles.ForEach(Sub(s) integers.Add(CInt(Math.Round(s)))) 
+0

첫 번째 코드를 이해하지 못했습니다 ... 마침내 'Dim myProduct = false'가 있습니까? – serhio

+0

아니 ... 부울로 평가되는 내부 함수입니다. 외부 함수는 제품을 산출합니다. 두 가지 용도의 차이점을 보여 주려고 했었습니다. First() 메서드는 각 항목을 true/false로 평가하는 조건부 필터를 사용합니다.이 경우 Id로 항목을 찾습니다. ForEach 연산자는 작업 수행을 반복하지만 아무 것도 반환하지 않습니다. – RichardW1001

3

.ForEach 확장 방법을 사용하여, 당신은 직접 결과를이 방법으로 생성 할 수 있습니다 오히려 있음 :

Dim integers = singles.Select(Function(x) Math.Round(x)).Cast(Of Integer)() 

또는 다음과 같이 .Cast를 사용하지 않고 :

Dim integers = singles.Select(Function(x) CInt(Math.Round(x))) 

List(Of Integer)을 미리 선언 할 필요가 없으므로 사용자가 절약 할 수 있습니다. 또한 변환을 적용하고 결과를 산출한다는 것이 더 명확하다고 생각합니다.

참고 : IEnumerable(Of Integer)을 생성하여 List(Of Integer) ...을 사용하는 대부분의 장소에서 사용할 수 있지만 추가 할 수는 없습니다. List을 원하면 위의 코드 샘플 끝에 .ToList()을 붙이기 만하면됩니다.