Udostępnij za pośrednictwem


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 , AppendStringktó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ą:

Zobacz też