Per rispondere alla domanda modificata: in breve, è utile utilizzare LINQ ogni volta che è necessario implementare la funzionalità di "query" (questo è ciò che rappresenta la Q in LINQ). Definire un dominio esatto è difficile, ma semplifica notevolmente una varietà di attività associate all'estrazione e alla manipolazione dei dati dalle raccolte.
Per elaborare leggermente, molte funzionalità di query sono state introdotte direttamente nel linguaggio (o meglio, i vari implementatori LINQ), quindi cose come aggregazioni, ordinamento, raggruppamento, filtro, proiezioni, join (e molti altri) sono tutte gestite per voi. Le soluzioni basate su LINQ sono anche in genere molto più brevi rispetto a quelle che dovresti implementare "a mano" e comunicano meglio le loro intenzioni.
Un semplice esempio che spesso aiuta a trasmettere la potenza di LINQ è quello di visualizzare i contenuti di una directory, raggruppati per estensione. Esegui un'implementazione imperativa tipica nella tua testa: ci saranno già molti dettagli di implementazione già all'inizio. Forse useremo a Dictionary<String, List<String>>
per indicizzare i file per estensione. Ovviamente, dovremo verificare se esiste già una chiave, creare un'istanza di un elenco, aggiungerla ad essa, ecc. Potrebbe essere simile a:
Dictionary<string, List<string>> fileGroups = new Dictionary<string, List<string>>();
foreach (string file in Directory.GetFiles(Environment.CurrentDirectory))
{
string extension = Path.GetExtension(file).ToLower();
if (!fileGroups.ContainsKey(extension))
{
fileGroups[extension] = new List<string>();
}
fileGroups[extension].Add(file);
}
Considera l'equivalente LINQ:
var query = from file in Directory.GetFiles(Environment.CurrentDirectory)
group file by Path.GetExtension(file).ToLower();
Si noti che la query stessa è solo di 2 righe, sicuramente più breve di qualsiasi soluzione imperativa che avremmo potuto trovare. È anche abbastanza leggibile; il rapporto segnale-rumore è superiore a quello della prima soluzione. Per quelli che sono nuovi a LINQ, avresti prodotto i risultati di quella query come segue:
foreach (var fileGroup in query)
{
Console.WriteLine(String.Format("*** Files with extension: {0}", group.Key));
foreach (string file in fileGroup)
{
Console.WriteLine(file);
}
}
Con esempi più complessi, le differenze normalmente diventano ancora più vaste (si consideri il semplice raggruppamento per più campi, ad esempio). Quindi, per riassumere, LINQ risolve molti problemi di interrogazione dei dati "giorno per giorno" in un modo che è spesso più breve e più auto-descrittivo. Ciò comporta un lieve costo per l'apprendimento della sintassi e della tecnologia, ma i vantaggi superano di molto gli aspetti negativi.