Per rispondere alla domanda modificata: in breve, è utile utilizzare LINQ ogni volta che si deve implementare la funzionalità "query" (è ciò che rappresenta la Q in LINQ). Definire un dominio esatto è difficile, ma semplifica enormemente una serie di attività associate all'estrazione e alla manipolazione dei dati dalle raccolte.
Per elaborare un po ', molte funzionalità di query sono state introdotte direttamente nel linguaggio (o meglio, i vari implementatori LINQ), quindi cose come aggregazioni, ordinamento, raggruppamento, filtraggio, proiezioni, join (e molti altri) sono tutto gestito per te. Le soluzioni basate su LINQ sono in genere molto più brevi rispetto a quelle che dovresti implementarle "a mano" e anche a comunicare 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 una tipica implementazione imperativa nella tua testa: ci saranno già molti dettagli sull'implementazione fin dall'inizio. Forse useremo Dictionary<String, List<String>>
per indicizzare i file per estensione. Ovviamente, dovremo controllare se una chiave esiste già, creare un'istanza di una lista, aggiungerla ad essa, ecc. Potrebbe essere qualcosa di 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 2 righe, certamente più breve di qualsiasi soluzione imperativa che avremmo potuto trovare. È anche abbastanza leggibile; il rapporto segnale-rumore è più alto di quanto non fosse con la prima soluzione. Per coloro che sono nuovi a LINQ, devi generare i risultati di tale 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 semplicemente il raggruppamento per più campi, ad esempio). Quindi, per sintetizzare, LINQ risolve molti problemi di "day to day" che interrogano i problemi in un modo che è spesso più breve e più auto-descrittivo. Ciò comporta un leggero costo di dover imparare la sintassi e la tecnologia, ma i vantaggi superano di gran lunga i negativi.