Sdílet prostřednictvím


Příklad odloženého spuštění (LINQ to XML)

Tento článek ukazuje, jak odložené spuštění a opožděné vyhodnocení ovlivňuje provádění dotazů LINQ to XML.

Příklad: Použití konstruktoru yield return v metodě rozšíření k odložení provádění

Následující příklad ukazuje pořadí provádění při použití rozšiřující metody, která používá odložené spuštění. Příklad deklaruje pole tří řetězců. Pak iteruje kolekcí vrácenou ConvertCollectionToUpperCase.

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();
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        string[] stringArray = { "abc", "def", "ghi" };

        var q = from str in stringArray.ConvertCollectionToUpperCase()
                select str;

        foreach (string str in q)
            Console.WriteLine("Main: str {0}", str);
    }
}
Imports System.Runtime.CompilerServices

Module Module1

    <Extension()>
    Private Iterator Function ConvertCollectionToUpperCase(
    ByVal source As IEnumerable(Of String)) _
    As IEnumerable(Of String)
        For Each str As String In source
            Console.WriteLine("ToUpper: source {0}", str)
            Yield str.ToUpper()
        Next
    End Function

    Sub Main()
        Dim stringArray = New String() {"abc", "def", "ghi"}

        Dim q = From str In stringArray.ConvertCollectionToUpperCase()
                Select str

        For Each Str As String In q
            Console.WriteLine("Main: str {0}", Str)
        Next
    End Sub

End Module

Tento příklad vytvoří následující výstup:

ToUpper: source abc
Main: str ABC
ToUpper: source def
Main: str DEF
ToUpper: source ghi
Main: str GHI

Všimněte si, že při iteraci kolekcí vrácenou ConvertCollectionToUpperCasekaždou položkou se načte ze zdrojového pole řetězců a před načtením další položky ze zdrojového pole řetězce se převede na velká písmena.

Můžete vidět, že celé pole řetězců není převedeno na velká písmena, než se každá položka ve vrácené kolekci zpracuje ve smyčce ve foreachMainsmyčce .

Viz také