延迟执行示例 (LINQ to XML)

本文介绍延迟执行和延迟评估如何影响 LINQ to XML 查询的执行。

示例:在扩展方法中使用yield return构造来延迟执行

以下示例演示使用使用延迟执行的扩展方法时的执行顺序。 该示例声明三个字符串的数组。 然后遍历 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

此示例生成以下输出:

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

请注意,在循环访问ConvertCollectionToUpperCase返回的集合时,每个项都从源字符串数组中检索,并在检索下一个项之前转换为大写字母。

可以看到,在 foreachMain 循环中处理所返回集合的每一项之后,字符串数组才会完全转换为大写形式。

另请参阅