Przykład zapytań łańcuchowych (C#) (LINQ to XML)
Ten przykład opiera się na przykładzie w przykładzie odroczonego wykonywania i pokazuje, co się stanie, gdy połączysz łańcuch dwóch zapytań, które używają odroczonego wykonania i leniwej oceny.
Przykład: Dodawanie drugiej metody rozszerzenia używanej yield return
do odroczenia wykonywania
W tym przykładzie wprowadzono inną metodę rozszerzenia , AppendString
która dołącza określony ciąg do każdego ciągu w kolekcji źródłowej, a następnie zwraca zmieniony ciąg.
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();
}
}
}
Ten przykład generuje następujące wyniki:
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!!!<
W tym przykładzie widać, że każda metoda rozszerzenia działa pojedynczo dla każdego elementu w kolekcji źródłowej.
W tym przykładzie powinno być jasne, że mimo że połączyliśmy ze sobą zapytania, które dają kolekcje, żadne kolekcje pośrednie nie są zmaterializowane. Zamiast tego każdy element jest przekazywany z jednej leniwej metody do następnej. Powoduje to znacznie mniejsze zużycie pamięci niż podejście, które najpierw zajęłoby jedną tablicę ciągów, a następnie utworzyć drugą tablicę ciągów, które zostały przekonwertowane na wielkie litery, a na koniec utworzyć trzecią tablicę ciągów, w których każdy ciąg ma dołączane wykrzykniki.
W następnym artykule w tym samouczku przedstawiono materializację pośrednią: