Condividi tramite


Concatenare operatori di query standard (C#) (LINQ to XML)

È possibile concatenare gli operatori di query standard. Ad esempio, è possibile inserire l'operatore Enumerable.Where (richiamato dalla clausola where) e opera in modo differito, ovvero non vengono materializzati risultati intermedi.

Esempio: Inserire una clausola where

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 viene iterato tramite 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.

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();
        }
    }
}

Nell'esempio viene prodotto l'output seguente:

ToUpper: source >abc<
ToUpper: source >def<
AppendString: source >DEF<
Main: str >DEF!!!<

ToUpper: source >ghi<
AppendString: source >GHI<
Main: str >GHI!!!<

Questo è l'articolo finale dell'Esercitazione: concatenamento di query (C#).