Condividi tramite


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

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 compila 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 di query viene enumerata più volte, i risultati possono variare ogni volta. Quasi tutti gli operatori query standard il cui tipo restituito è IEnumerable o IOrderedEnumerable 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``1

TSource

X

 

 

All``1

Boolean

X

 

 

Any``1

Boolean

X

 

 

AsEnumerable``1

IEnumerable

 

X

 

Average

Singolo valore numerico

X

 

 

Cast``1

IEnumerable

 

X

 

Concat``1

IEnumerable

 

X

 

Contains``1

Boolean

X

 

 

Count``1

Int32

X

 

 

DefaultIfEmpty``1

IEnumerable

 

X

 

Distinct``1

IEnumerable

 

X

 

ElementAt``1

TSource

X

 

 

ElementAtOrDefault``1

TSource

X

 

 

Empty``1

IEnumerable

X

 

 

Except``1

IEnumerable

 

X

 X

First``1

TSource

X

 

 

FirstOrDefault``1

TSource

X

 

 

GroupBy``2

IEnumerable

 

 

X

GroupJoin

IEnumerable

 

X

Intersect

IEnumerable

 

X

X

Join

IEnumerable

 

X

X

Last``1

TSource

X

 

 

LastOrDefault``1

TSource

X

 

 

LongCount``1

Int64

X

 

 

Max

Singolo valore numerico, TSource o TResult

X

 

 

Min

Singolo valore numerico, TSource o TResult

X

 

 

OfType``1

IEnumerable

 

X

 

OrderBy``2

IOrderedEnumerable

 

 

X

OrderByDescending``2

IOrderedEnumerable

 

 

X

Range

IEnumerable

 

X

 

Repeat``1

IEnumerable

 

X

 

Reverse``1

IEnumerable

 

 

X

Select``2

IEnumerable

 

X

 

SelectMany

IEnumerable

 

X

 

SequenceEqual

Boolean

X

 

 

Single``1

TSource

X

 

 

SingleOrDefault``1

TSource

X

 

 

Skip``1

IEnumerable

 

X

 

SkipWhile``1

IEnumerable

 

X

 

Sum

Singolo valore numerico

X

 

 

Take``1

IEnumerable

 

X

 

TakeWhile``1

IEnumerable

 

X

 

ThenBy``2

IOrderedEnumerable

 

 

X

ThenByDescending``2

IOrderedEnumerable

 

 

X

ToArray``1

Matrice di TSource

X

 

 

ToDictionary``2

Dictionary

X

 

 

ToList``1

IList

X

 

 

ToLookup``2

ILookup

X

 

 

Union``1

IEnumerable

 

X

 

Where``1

IEnumerable

 

X

 

Vedere anche

Riferimenti

Enumerable

Concetti

Cenni preliminari sugli operatori di query standard

Sintassi di espressione della query per operatori di query standard

LINQ to Objects