Rubik ha scritto:
LINQ riduce i controlli ad una sorta di database di controlli, molto potente nelle ricerche attraverso Query.
LINQ è solamente una libreria che aggiunge dei metodi di estensione a tutti i tipi che sono "enumerabili" (
IEnumerable<T>).
Ogni enumerazione estrae un valore alla volta partendo dal primo fino a esaurimento: i metodi LINQ consentono di concatenare filtri, ordinamenti, raggruppamenti, accorpamenti, somme, medie, conteggi, ecc. a qualcosa di enumerabile, creando una nuova enumerazione.
Quando i valori vengono estratti dall'enumerazione uno alla volta, la catena dei metodi fa sì che ciascuna enumerazione creata chieda il valore successivo alla precedente, combinando sostanzialmente tutte le operazioni definite nel momento in cui l'espressione viene creata.
Generando delle enumerazioni, i metodi non producono direttamente i risultati: questi vengono determinati quando si inizia l'estrazione dei loro valori, o perché impiegati in un ciclo (es.
foreach() di C#) o usando uno dei tanti metodi che dall'enumerazione producono una lista, un array, il valore del primo elemento, dell'ultimo, dell'unico presente, ecc.
Quello che è un ulteriore valore aggiunto di LINQ è il fatto di supportare anche una sintassi dedicata con cui è possibile esprimere la catena dei metodi in modo leggibile, e anche poter inviare l'espressione creata a diversi tipi di "motori", affinché analizzino l'albero dell'espressione e, oltre a lavorare su oggetti, possano applicarla anche a basi di dati (vedi
Entity Framework) o altri interpreti che utilizzano l'espressione specificata per convertirla in una interrogazione in un altro linguaggio (es. SQL nel caso di EF) o per elaborarla in altro modo.
Rubik ha scritto:
Ora mi chiedo, quando è utile usare tale metodo?
Va usato tutte le volte che è possibile.
Rubik ha scritto:
Qual è il vantaggio di "complicare" una cosa semplice come raggruppare i controlli in una lista e raggiungerli direttamente con un indice senza effettuare una ricerca?
In realtà, la complicazione si ha evitando l'uso di LINQ. Supponiamo di avere una serie di controlli con la proprietà Visible e di voler ottenere una lista dei nomi di tutti i controlli che attualmente sono visibili. Come si farebbe generalmente? Io ipotizzo una cosa del genere...
var visibleControlNames = new List<string>();
foreach(var someControl in Form.Controls)
{
if (!someControl.Visible)
continue;
visibleControlNames.Add(someControl.Name);
}
Per sapere cosa fa questo codice, è necessario analizzarlo e, una volta viste le istruzioni, capire che alla fine nella lista vengono messi i nomi dei controlli quando questi risultano visibili.
Usando LINQ, questa cosa si potrebbe riscrivere come segue:
var visibleControlNames = (
from c in Form.Controls
where c.Visible
select c.Name)
.ToList();
In questo caso, non è necessario analizzare il codice: basta leggerlo.
Il codice esprime esattamente quella che è l'intenzione di ciò che si vuole ottenere.
Certo, lo sforzo sembrerebbe superfluo, ma supponiamo ora di aggiungere una complessità, ossia ordinare i controlli in base al nome; ecco che il primo esempi richiede di scrivere del codice in più, e non poco, mentre con LINQ ce la possiamo cavare semplicemente aggiungendo la relativa clausola:
var visibleControlNames = (
from c in Form.Controls
where c.Visible
orderby c.Name
select c.Name)
.ToList();
Possiamo estrarre dall'espressione quello che vogliamo, anche tipi anonimi. Ad esempio, se vogliamo ottenere un oggetto che contiene il riferimento al controllo e anche il suo nome, possiamo scrivere questo nella
select (proiezione):
var visibleControlNames = (
from c in Form.Controls
where c.Visible
orderby c.Name
select new {ControlName = c.Name, ControlObj = c})
.ToList();
Esistono poi tanti altri metodi di utilità: ad esempio, con
Distinct() eliminiamo i duplicati, con
Skip() e
Take() rispettivamente saltiamo N elementi della sequenza e prendiamo un numero massimo di elementi da quella posizione in poi.
Rubik ha scritto:
Usiamo un DB quando i dati da trattare sono variegati e corposi, centinaia di tipi e milioni di record, quando può capitare una cosa simile con dei controlli su un form?
Non c'entra il numero di elementi, bensì il tipo di operazione che si intende svolgere e la complessità necessaria per implementarla nel codice scrivendola manualmente al posto di usare gli operatori LINQ già disponibili: in questi casi, non fare uso di LINQ significa sprecare tempo e soprattutto scrivere codice "error prone" (i copia/incolla e la riproduzione di codice sempre uguale espone a errori).
Rubik ha scritto:
Avevo dato solo un'occhiata a LINQ, e questo thread mi ha fatto capire molte cose, ora so che LINQ deve essere tenuto in considerazione, mi manca solo il perché.
Posso suggerire di scaricare un programma estremamente utile,
LINQPad, e di vedere gli esempi che vi sono all'interno, facendo qualche
esercitazione proposta dalla documentazione ufficiale.
A mio avviso,
conoscere LINQ è imprescindibile in .NET, soprattutto perché è una implementazione fatta molto bene che non esiste in tutti gli altri linguaggi dello stesso tipo, o almeno non in questa forma e con questi vantaggi.
Ciao!