Příklad řetězení dotazů (C#) (LINQ to XML)
Tento příklad vychází z příkladu v příkladu provádění Deferred a ukazuje, co se stane, když zřetězíte dva dotazy, které používají odložené spuštění i opožděné vyhodnocení.
Příklad: Přidání druhé metody rozšíření, která se používá yield return
k odložení provádění
V tomto příkladu se zavádí další rozšiřující metoda, AppendString
která 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ědili dotazy, které poskytují kolekce, nejsou žádné přechodné kolekce materializovány. Místo toho se každá položka předává z jedné opožděné metody do další. Výsledkem je mnohem menší nároky na paměť než přístup, který by nejprve vzal jednu matici řetězců, pak vytvořte druhou matici řetězců, která byla převedena na velká písmena, a nakonec vytvořte třetí pole řetězců, kde každý řetězec má připojené vykřičníky.
Další článek v tomto kurzu ukazuje průběžnou materializaci: