2011-05-16 8 views
13

que estoy tratando de reemplazar el For Each bucle clásico con la extensión de LINQ ForEach en VB.NET ...ParaCada de LINQ con métodos anónimos en VB.NET

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 

Tal vez algo como esto?

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

¿Cómo puedo hacer esto correctamente utilizando métodos anónimos (es decir, sin declarar una nueva función)?

Respuesta

18

Prueba esto:

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

Se necesita un Sub aquí, porque el cuerpo de su bucle For Each no devuelve un valor.

1

Utilizaría una función si espera que la expresión en línea devuelva un valor. Por ejemplo:

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

Esto sería utilizar una expresión de función, porque es algo que se evalúa como un valor booleano (p.Id = 1).

Es necesario utilizar una Sub porque no hay nada de ser devuelto por la expresión:

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

no entiendo el primer código ... finalmente tienes 'Dim myProduct = false'? – serhio

+0

No ... es la función interna que se evalúa como booleana, la función externa produce un Producto. Estaba tratando de mostrar la distinción entre los dos usos; el método First() toma un filtro de predicados que evalúa cada elemento a verdadero/falso, en este caso buscando un elemento por Id. El operador ForEach itera al realizar una acción pero no devuelve nada. – RichardW1001

3

Más bien que usando el método .ForEach extensión, sólo puede producir directamente los resultados de esta manera:

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

o sin el uso de .Cast, así:

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

Le ahorra tener que predefinir el List(Of Integer) y también creo que es más claro que simplemente está aplicando una transformación y está produciendo un resultado (que es claro desde la asignación).

Nota: esto produjo un IEnumerable(Of Integer) que se puede utilizar en la mayoría de los lugares donde utilizaría un List(Of Integer) ... pero no puede agregarse. Si desea un List, simplemente ingrese .ToList() al final de los ejemplos de código anteriores.

Cuestiones relacionadas