Przykład odroczonego wykonania (LINQ to XML)
W tym artykule pokazano, jak odroczone wykonanie i leniwa ocena wpływają na wykonywanie zapytań LINQ to XML.
Przykład: użyj yield return
konstrukcji w metodzie rozszerzenia, aby odroczyć wykonywanie
W poniższym przykładzie pokazano kolejność wykonywania podczas korzystania z metody rozszerzenia korzystającej z odroczonego wykonywania. W przykładzie zadeklarowana jest tablica trzech ciągów. Następnie wykonuje iterację po kolekcji zwróconej przez ConvertCollectionToUpperCase
element .
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
Ten przykład generuje następujące wyniki:
ToUpper: source abc
Main: str ABC
ToUpper: source def
Main: str DEF
ToUpper: source ghi
Main: str GHI
Zwróć uwagę, że podczas iteracji przez kolekcję zwróconą przez ConvertCollectionToUpperCase
element każdy element jest pobierany z tablicy ciągów źródłowych i konwertowany na wielkie litery przed pobraniem następnego elementu z tablicy ciągów źródłowych.
Widać, że cała tablica ciągów nie jest konwertowana na wielkie litery, zanim każdy element w zwróconej kolekcji zostanie przetworzony w pętli w Main
elemencie foreach
.