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 ConvertCollectionToUpperCase
kaž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 foreach
Main
smyčce .