Introduzione alle query con LINQ

3 pagine in totale: <<Indietro 1 2 [3]

Operatori per liste

Distinct, Union, Except, Intersect

Questi metodi effettuano il raffronto tra due liste effettuando rispettivamente:

  • L'eliminazione degli oggetti uguali
  • L'unione delle liste in una eliminando gli oggetti uguali
  • La restituzione degli oggetti nella prima lista non presenti nella seconda
  • La restituzione degli oggetti nella prima lista presenti anche nella seconda

Per verificare l'uguaglianza tra gli oggetti ci sono due modalità; la prima è fare l'override dei metodi GetHashCode e Equals nelle classi, la seconda è creare una classe che implementa IEqualityComparer<T> e passarla in input al metodo che si utilizza. Questi operatori sono stati già trattati nella rubrica XCript quindi ulteriori approfondimenti sono raggiungibili a questo indirizzo.

Operatori di aggregazione

Gli operatori di aggregazione possono fornire dati sulle aggregazioni di dati.

Average, Max, Min, Sum

Questi operatori ritornano la media, il valore massimo, quello minimo e la somma dell'espressione che viene specificata nella lambda expression passata in input.

var result = persone.Average(p => p.Eta);
var result = persone.Max(p => p.Eta);
var result = persone.Min(p => p.Eta);
var result = persone.Sum(p => p.Eta);

Il risultato di questi operatori viene messo in una variabile del tipo dell'espressione valutata.

Count, LongCount

Questi operatori tornano il totale degli elementi rispettivamente come int e come long. Esistono due overload di questi metodi; uno che non accetta alcun parametro ed uno che accetta una lambda expression dove specificare una condizione. Utilizzando questo secondo overload, viene tornato il totale di oggetti che soddisfano la condizione.

Operatori di elemento

Gli operatori che fanno parte di questa categoria permettono di ritornare un elemento che si trova ad una specifica condizione.

ElementAt, First, Last, Single

Questi operatori rispettivamente ritornano:

  • Un elemento ad una determinata posizione. Nel caso non ci sia un elemento nella posizione, viene sollevata un'eccezione.
  • Il primo elemento. Nel caso ci siano più elementi, viene restituito solo il primo. Nel caso non ci siano elementi, viene sollevata un'eccezione.
  • L'ultimo elemento. La regola per le eccezioni è la stessa per First.
  • Il primo elemento. Nel caso non ci siano elementi o ci siano più elementi, viene sollevata un'eccezione.
Ognuno di questi operatori supporta un overload che accetta una lambda Expression in input. Questa specifica una condizione di filtro causando il fatto che l'operatore si applica ai soli oggetti che rispettano la condizione.

ElementAtOrDefault, FirstOrDefault, LastOrDefault, SingleOrDefault

Questi operatori eseguono le stesse operazioni dei metodi precedenti con una grossa differenza. Nessuna eccezione viene sollevata, bensì viene restituito un oggetto dal valore default dove T è il tipo di oggetto che ci si aspetta in output (ad esempio: 0 per un int, null per un Reference Type, false per un booleano).

Operatori di raggruppamento

GroupBy

L'unico operatore di questa categoria è GroupBy e permette di raggruppare gli oggetti in base ad una chiave specificata. La chiave può essere un qualunque oggetto: una stringa, un intero, una classe, ecc ecc.

var result = persone.GroupBy(p => p.Eta);

Il risultato di questa query è un oggetto IEnumerable<IGrouping<int, Persona>>; in altre parole è una lista di oggetti che hanno una proprietà di tipo int che rappresenta la chiave, ovvero l'età della persona, ed una proprietà di tipo IEnumerable che rappresenta tutte le persone che appartengono a quell'età. Per scorrere la lista si può ricorrere al seguente codice:

foreach (var item in result)
{
  Console.WriteLine(item.Key);
  foreach (var el in item)
    Console.WriteLine(el.Nome + " " + el.Cognome);
}

Uno degli overload di questo metodo permette di specificare l'oggetto da inserire nella lista associata alla chiave.

var result = persone.GroupBy(p => p.Eta, p => p.Nome + " " + p.Cognome);
foreach (var item in result)
{
  Console.WriteLine(item.Key);
  foreach (var el in item)
    Console.WriteLine(el);
}

Operatori di conversione

ToArray, ToList, AsEnumerable

Questi operatori trasformano la lista a cui vengono applicati ad un'istanza rispettivamente di tipo List<T>, T[], IEnumerable<T>.

Cast

L'operatore Cast converte la lista a cui viene applicato in una lista di tipo List<T>. La differenza dal metodo ToList è che è che in questo caso il tipo è specificato nel metodo mentre in ToList viene ricavato automaticamente dal compilatore.

var result = Controls.Cast<Control>();

Conclusioni

LINQ offre immense possibilità quando si tratta di eseguire query. Ciò che prima richiedeva diversi cicli e righe di codice, adesso può essere ottenuto con una semplicità spesso addirittura disarmante. Se si pensa soprattutto agli operatori di raggruppamento, proiezione (in particolare SelectMany) ed aggregazione ci si rende conto che la quantità di codice diminuisce sensibilmente e la sua qualità aumenta nello stesso momento.

3 pagine in totale: <<Indietro 1 2 [3]

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.



TUTORIALS


IN EVIDENZA
MISC