延後執行範例 (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
所傳回的集合時,會從來源字串陣列擷取每個項目,並在下一個項目從來源字串陣列擷取前,轉換為大寫。
您可以看到,在傳回之集合內的每個項目於 Main
的 foreach
迴圈中處理之前,字串的整個陣列都不會轉換為大寫。