Condividi tramite


Classificazione degli operatori di query standard in base alla modalità di esecuzione

Aggiornamento: novembre 2007

Le implementazioni LINQ to Objects dei metodi degli operatori di query standard vengono eseguite in due modalità principali: immediata o posticipata. Gli operatori di query che utilizzano l'esecuzione posticipata possono essere ulteriormente suddivisi in due categorie: di flusso e non di flusso. Se si conosce la modalità di esecuzione dei vari operatori di query, può risultare utile comprendere i risultati che si ottengono da una determinata query, soprattutto nel caso in cui l'origine dati venga modificata o se si crea una query su un'altra query. In questo argomento è riportata una classificazione degli operatori di query standard in base alla relativa modalità di esecuzione.

Modalità di esecuzione

Immediata

Per esecuzione immediata si intende che l'origine dati viene letta e l'operazione viene eseguita in corrispondenza del punto di codice in cui viene dichiarata la query. Tutti gli operatori di query standard che restituiscono un singolo risultato non enumerabile vengono eseguiti immediatamente.

Posticipata

Per esecuzione posticipata si intende che l'operazione non viene eseguita in corrispondenza del punto di codice in cui viene dichiarata la query, ma soltanto quando viene enumerata la variabile della query, ad esempio tramite l'istruzione foreach (For Each in Visual Basic). Pertanto, i risultati dell'esecuzione della query dipendono dal contenuto dell'origine dati nel momento in cui la query viene eseguita anziché quando viene definita. Se la variabile della query viene enumerata più volte, i risultati possono variare ogni volta. Quasi tutti gli operatori di query standard il cui tipo restituito è IEnumerable<T> o IOrderedEnumerable<TElement> vengono eseguiti in modalità posticipata.

Gli operatori che utilizzano l'esecuzione posticipata possono essere ulteriormente classificati come di flusso o non di flusso.

Di flusso

Gli operatori di flusso non devono necessariamente leggere tutti i dati di origine prima di produrre elementi. Al momento dell'esecuzione, un operatore di flusso esegue la propria operazione su ogni elemento di origine che viene letto e produce l'elemento, se appropriato. Un operatore di flusso continua a leggere gli elementi di origine finché non può essere prodotto un elemento risultante. Pertanto, per produrre un unico elemento risultante è possibile che vengano letti più elementi di origine.

Non di flusso

Gli operatori non di flusso devono leggere tutti i dati di origine prima di produrre un elemento risultante. Rientrano in questa categoria operazioni quale ordinamento o raggruppamento. Al momento dell'esecuzione, gli operatori di query non di flusso leggono tutti i dati di origine, li inseriscono in una struttura di dati, eseguono l'operazione e producono gli elementi risultanti.

Tabella di classificazione

Nella tabella seguente è riportata una classificazione di tutti gli operatori di query standard in base al relativo metodo di esecuzione.

Nota:

Se un operatore è contrassegnato in due colonne, significa che nell'operazione sono coinvolte due sequenze di input, ognuna delle quali valutata in modo diverso. In questi casi, viene sempre valutata la prima sequenza nell'elenco di parametri in modalità posticipata non di flusso.

Operatore di query standard

Tipo restituito

Esecuzione immediata

Esecuzione di flusso posticipata

Esecuzione non di flusso posticipata

Aggregate

TSource

X

 

 

All<TSource>

Boolean

X

 

 

Any

Boolean

X

 

 

AsEnumerable<TSource>

IEnumerable<T>

X

 

Average

Singolo valore numerico

X

 

 

Cast<TResult>

IEnumerable<T>

 

X

 

Concat<TSource>

IEnumerable<T>

 

X

 

Contains

Boolean

X

 

 

Count

Int32

X

 

 

DefaultIfEmpty

IEnumerable<T>

 

X

 

Distinct

IEnumerable<T>

 

X

 

ElementAt<TSource>

TSource

X

 

 

ElementAtOrDefault<TSource>

TSource

X

 

 

Empty<TResult>

IEnumerable<T>

X

 

 

Except

IEnumerable<T>

X

 X

First

TSource

X

 

 

FirstOrDefault

TSource

X

 

 

GroupBy

IEnumerable<T>

 

 

X

GroupJoin

IEnumerable<T>

X

Intersect

IEnumerable<T>

X

X

Join

IEnumerable<T>

X

X

Last

TSource

X

 

 

LastOrDefault

TSource

X

 

 

LongCount

Int64

X

 

 

Max

Singolo valore numerico, TSource o TResult

X

 

 

Min

Singolo valore numerico, TSource o TResult

X

 

 

OfType<TResult>

IEnumerable<T>

 

X

 

OrderBy

IOrderedEnumerable<TElement>

 

 

X

OrderByDescending

IOrderedEnumerable<TElement>

 

 

X

Range

IEnumerable<T>

 

X

 

Repeat<TResult>

IEnumerable<T>

 

X

 

Reverse<TSource>

IEnumerable<T>

 

 

X

Select

IEnumerable<T>

 

X

 

SelectMany

IEnumerable<T>

 

X

 

SequenceEqual

Boolean

X

 

 

Single

TSource

X

 

 

SingleOrDefault

TSource

X

 

 

Skip<TSource>

IEnumerable<T>

 

X

 

SkipWhile

IEnumerable<T>

 

X

 

Sum

Singolo valore numerico

X

 

 

Take<TSource>

IEnumerable<T>

 

X

 

TakeWhile

IEnumerable<T>

 

X

 

ThenBy

IOrderedEnumerable<TElement>

 

 

X

ThenByDescending

IOrderedEnumerable<TElement>

 

 

X

ToArray<TSource>

Matrice di TSource

X

 

 

ToDictionary

Dictionary<TKey, TValue>

X

 

 

ToList<TSource>

IList<T>

X

 

 

ToLookup

ILookup<TKey, TElement>

X

 

 

Union

IEnumerable<T>

 

X

 

Where

IEnumerable<T>

 

X

 

Vedere anche

Concetti

Cenni preliminari sugli operatori di query standard

Sintassi di espressione della query per operatori di query standard

LINQ to Objects

Riferimenti

Enumerable