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.
Si no tiene cuidado, en algunas situaciones puede alterar drásticamente el perfil de memoria y rendimiento de su aplicación causando una materialización prematura de las recopilaciones de sus consultas.Algunos operadores de consulta estándar provocan la materialización de su recopilación de origen antes de producir un elemento único.Por ejemplo, Enumerable.OrderBy primero recorre en iteración toda la recopilación de origen, después ordena todos los elementos y finalmente produce el primer elemento.Esto significa que resulta caro obtener el primer elemento de una recopilación ordenada; cada elemento posterior no es caro.Esto tiene sentido: sería imposible que el operador de consulta hiciera lo contrario.
Ejemplo
Este ejemplo altera el ejemplo anterior.El método AppendString llama a ToList<TSource> antes de recorrer en iteración el origen.Esto provoca la materialización.
[!NOTA]
En el ejemplo de código siguiente se utiliza la construcción yield return de C#.Puesto que no hay ninguna característica equivalente en Visual Basic 2008, este ejemplo sólo se proporciona en C#.
public static class LocalExtensions
{
public static IEnumerable<string>
ConvertCollectionToUpperCase(this IEnumerable<string> source)
{
foreach (string str in source)
{
Console.WriteLine("ToUpper: source >{0}<", str);
yield return str.ToUpper();
}
}
public static IEnumerable<string>
AppendString(this IEnumerable<string> source, string stringToAppend)
{
// the following statement materializes the source collection in a List<T>
// before iterating through it
foreach (string str in source.ToList())
{
Console.WriteLine("AppendString: source >{0}<", str);
yield return str + stringToAppend;
}
}
}
class Program
{
static void Main(string[] args)
{
string[] stringArray = { "abc", "def", "ghi" };
IEnumerable<string> q1 =
from s in stringArray.ConvertCollectionToUpperCase()
select s;
IEnumerable<string> q2 =
from s in q1.AppendString("!!!")
select s;
foreach (string str in q2)
{
Console.WriteLine("Main: str >{0}<", str);
Console.WriteLine();
}
}
}
Este ejemplo genera el siguiente resultado:
ToUpper: source >abc<
ToUpper: source >def<
ToUpper: source >ghi<
AppendString: source >ABC<
Main: str >ABC!!!<
AppendString: source >DEF<
Main: str >DEF!!!<
AppendString: source >GHI<
Main: str >GHI!!!<
En este ejemplo puede ver que la llamada a ToList<TSource> hace que AppendString enumere todo su origen antes de producir el primer elemento.Si el origen fuera una matriz grande, alteraría significativamente el perfil de memoria de la aplicación.
Pasos siguientes
Los operadores de consulta estándar también se pueden encadenar juntos.Esto se ilustra en el tema final de este tutorial.