Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Se você não for cauteloso, em algumas situações, poderá alterar drasticamente a memória e o perfil de desempenho do seu aplicativo causando a materialização prematura das coleções nas suas consultas. Alguns operadores de consulta padrão causam a materialização de sua coleção de origem antes de produzir um único elemento. Por exemplo, Enumerable.OrderBy primeiro itera por toda a coleção de origem, depois classifica todos os itens e, finalmente, produz o primeiro item. Isso significa que é caro obter o primeiro item de uma coleção ordenada; cada item depois disso não é caro. Isso faz sentido; seria impossível para esse operador de consulta fazer o contrário.
Exemplo: adicionar um método que chama ToList, causando materialização
Este exemplo altera o exemplo no Encadear exemplo de consultas (C#): o método AppendString é alterado para chamar ToList antes de iterar pela origem, o que causa materialização.
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 exemplo produz a seguinte saída:
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!!!<
Neste exemplo, você pode ver que a chamada de ToList faz com que AppendString enumere toda a sua origem antes de apresentar o primeiro item. Se a origem fosse uma matriz grande, isso alteraria significativamente o perfil de memória do aplicativo.
Os operadores de consulta padrão também podem ser encadeados, conforme mostrado no artigo final deste tutorial: