Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento příklad vychází z příkladu odloženého provádění a ukazuje, co nastane, když zřetězíte dva dotazy, které používají odložené provádění a líné vyhodnocení.
Příklad: Přidejte druhou metodu rozšíření, která používá yield return k odložení provádění.
V tomto příkladu se zavádí další rozšiřující metoda, AppendStringkterá připojí zadaný řetězec ke každému řetězci ve zdrojové kolekci a poté získá změněný řetězec.
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)
{
foreach (string str in source)
{
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();
}
}
}
Tento příklad vytvoří následující výstup:
ToUpper: source >abc<
AppendString: source >ABC<
Main: str >ABC!!!<
ToUpper: source >def<
AppendString: source >DEF<
Main: str >DEF!!!<
ToUpper: source >ghi<
AppendString: source >GHI<
Main: str >GHI!!!<
V tomto příkladu vidíte, že každá metoda rozšíření pracuje po jednom pro každou položku ve zdrojové kolekci.
Z tohoto příkladu by mělo být zřejmé, že i když jsme zřetězili dotazy, které vracejí kolekce, žádné mezilehlé kolekce nejsou materializovány. Místo toho se každá položka předává z jedné líné metody do další. Výsledkem je mnohem menší paměťová stopa než přístup, který nejprve vezme jedno pole řetězců, pak vytvoří druhé, kde jsou řetězce převedeny na velká písmena, a nakonec třetí pole řetězců, kde je ke každému řetězci připojen vykřičník.
Další článek v tomto kurzu ukazuje průběžnou materializaci: