Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La proyección hace referencia a la operación de transformar un objeto en una nueva forma que a menudo consiste solo en aquellas propiedades que se utilizarán posteriormente. Mediante la proyección, puede construir un nuevo tipo que se compila a partir de cada objeto. Puede proyectar una propiedad y realizar una función matemática en ella. También puede proyectar el objeto original sin cambiarlo.
Los métodos del operador de consulta estándar que realizan la proyección se enumeran en la sección siguiente.
Métodos
Nombre del método | Descripción | Sintaxis de expresión de consulta de Visual Basic | Más información |
---|---|---|---|
Seleccionar | Proyecta valores basados en una función de transformación. | Select |
Enumerable.Select Queryable.Select |
SelectMany | Proyecta secuencias de valores que se basan en una función de transformación y, a continuación, las aplana en una secuencia. | Usa varias From cláusulas |
Enumerable.SelectMany Queryable.SelectMany |
Código postal | Genera una secuencia de tuplas con elementos provenientes de 2 o 3 secuencias especificadas. | No aplicable. | Enumerable.Zip Queryable.Zip |
Ejemplos de sintaxis de expresiones de consulta
Seleccionar
En el ejemplo siguiente se usa la Select
cláusula para proyectar la primera letra de cada cadena en una lista de cadenas.
Dim words = New List(Of String) From {"an", "apple", "a", "day"}
Dim query = From word In words
Select word.Substring(0, 1)
Dim sb As New System.Text.StringBuilder()
For Each letter As String In query
sb.AppendLine(letter)
Next
' Display the output.
MsgBox(sb.ToString())
' This code produces the following output:
' a
' a
' a
' d
SelectMany
En el ejemplo siguiente se usan varias From
cláusulas para proyectar cada palabra de cada cadena en una lista de cadenas.
Dim phrases = New List(Of String) From {"an apple a day", "the quick brown fox"}
Dim query = From phrase In phrases
From word In phrase.Split(" "c)
Select word
Dim sb As New System.Text.StringBuilder()
For Each str As String In query
sb.AppendLine(str)
Next
' Display the output.
MsgBox(sb.ToString())
' This code produces the following output:
' an
' apple
' a
' day
' the
' quick
' brown
' fox
Select frente a SelectMany
El trabajo de tanto Select()
como SelectMany()
es generar un valor de resultado (o valores) a partir de valores de origen.
Select()
genera un valor de resultado para cada valor de origen. Por lo tanto, el resultado general es una colección que tiene el mismo número de elementos que la colección de origen. En cambio, SelectMany()
genera un único resultado general que contiene subcolecciones concatenadas de cada valor fuente. La función de transformación que se pasa como argumento a SelectMany()
debe devolver una secuencia enumerable de valores para cada valor de origen. Estas secuencias enumerables se concatenan por SelectMany()
para crear una secuencia grande.
Las dos ilustraciones siguientes muestran la diferencia conceptual entre las acciones de estos dos métodos. En cada caso, se supone que la función de selector (transformación) selecciona la matriz de flores de cada valor de origen.
En esta ilustración se muestra cómo Select()
devuelve una colección que tiene el mismo número de elementos que la colección de origen.
En esta ilustración se muestra cómo SelectMany()
concatena la secuencia intermedia de matrices en un valor de resultado final que contiene cada valor de cada matriz intermedia.
Ejemplo de código
En el ejemplo siguiente se compara el comportamiento de Select()
y SelectMany()
. El código crea un "ramo" de flores tomando los elementos de cada lista de nombres de flores de la colección de origen. En este ejemplo, el "valor único" que usa la función Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) de transformación es una colección de valores. Esto requiere el bucle adicional For Each
para enumerar cada cadena en cada subcadenamiento.
Class Bouquet
Public Flowers As List(Of String)
End Class
Sub SelectVsSelectMany()
Dim bouquets = New List(Of Bouquet) From {
New Bouquet With {.Flowers = New List(Of String)(New String() {"sunflower", "daisy", "daffodil", "larkspur"})},
New Bouquet With {.Flowers = New List(Of String)(New String() {"tulip", "rose", "orchid"})},
New Bouquet With {.Flowers = New List(Of String)(New String() {"gladiolis", "lily", "snapdragon", "aster", "protea"})},
New Bouquet With {.Flowers = New List(Of String)(New String() {"larkspur", "lilac", "iris", "dahlia"})}}
Dim output As New System.Text.StringBuilder
' Select()
Dim query1 = bouquets.Select(Function(b) b.Flowers)
output.AppendLine("Using Select():")
For Each flowerList In query1
For Each str As String In flowerList
output.AppendLine(str)
Next
Next
' SelectMany()
Dim query2 = bouquets.SelectMany(Function(b) b.Flowers)
output.AppendLine(vbCrLf & "Using SelectMany():")
For Each str As String In query2
output.AppendLine(str)
Next
' Display the output
MsgBox(output.ToString())
' This code produces the following output:
'
' Using Select():
' sunflower
' daisy
' daffodil
' larkspur
' tulip
' rose
' orchid
' gladiolis
' lily
' snapdragon
' aster
' protea
' larkspur
' lilac
' iris
' dahlia
' Using SelectMany()
' sunflower
' daisy
' daffodil
' larkspur
' tulip
' rose
' orchid
' gladiolis
' lily
' snapdragon
' aster
' protea
' larkspur
' lilac
' iris
' dahlia
End Sub
Consulte también
- System.Linq
- Información General sobre los Operadores de Consulta Estándar (Visual Basic)
- Cláusula de Selección
- Procedimiento: Combinar datos con combinaciones
- Cómo: Rellenar colecciones de objetos de varios orígenes (LINQ) (Visual Basic)
- Procedimiento para devolver un resultado de consulta LINQ como un tipo específico
- Cómo: Dividir un archivo en muchos archivos mediante grupos (LINQ) (Visual Basic)