Concatenamento di operatori di query standard
Questo è l'argomento finale dell'esercitazione Concatenamento di query.
È anche possibile concatenare gli operatori di query standard. Ad esempio, è possibile inserire l'operatore Enumerable.Where che opera anch'esso in modo lazy. Questo operatore non materializza nessun risultato intermedio.
Esempio
In questo esempio viene chiamato il metodo Where prima della chiamata a ConvertCollectionToUpperCase. Il metodo Where opera quasi esattamente allo stesso modo dei metodi lazy usati negli esempi precedenti di questa esercitazione, ovvero ConvertCollectionToUpperCase e AppendString.
La differenza è che in questo caso il metodo Where scorre la raccolta di origine, determina che il primo elemento non passa il predicato, quindi ottiene l'elemento successivo, che invece passa. Infine restituisce il secondo elemento.
Tuttavia, l'idea di base è la stessa: le raccolte intermedie vengono materializzate solo se è necessario.
Quando si usano le espressioni di query, vengono convertite in chiamate agli operatori di query standard e si applicano gli stessi principi.
Tutti gli esempi di questa sezione in cui vengono eseguite query su documenti Office Open XML si basano sullo stesso principio. Le idee di esecuzione posticipata e valutazione lazy sono alcuni dei concetti fondamentali che è necessario comprendere per usare LINQ e LINQ to XML in modo efficace.
Nota
Nell'esempio seguente viene usato il costrutto yield return di C#.Poiché non esiste una funzionalità equivalente in Visual Basic 2008, questo esempio viene fornito solo in C#.
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();
}
}
public static IEnumerable<string>
AppendString(this IEnumerable<string> source, string stringToAppend)
{
foreach (string str in source)
{
Console.WriteLine("AppendString: source >{0}<", str);
yield return str + stringToAppend;
}
}
}
class Program
{
static void Main(string[] args)
{
string[] stringArray = { "abc", "def", "ghi" };
IEnumerable<string> q1 =
from s in stringArray.ConvertCollectionToUpperCase()
where s.CompareTo("D") >= 0
select s;
IEnumerable<string> q2 =
from s in q1.AppendString("!!!")
select s;
foreach (string str in q2)
{
Console.WriteLine("Main: str >{0}<", str);
Console.WriteLine();
}
}
}
Questo esempio produce il seguente output:
ToUpper: source >abc<
ToUpper: source >def<
AppendString: source >DEF<
Main: str >DEF!!!<
ToUpper: source >ghi<
AppendString: source >GHI<
Main: str >GHI!!!<