Per quale problema è stato creato LINQ?


12

Ogni volta che vedo una domanda pubblicata su Stack Overflow su C #, vedo almeno una o due risposte che risolvono un problema con LINQ. Di solito le persone con una reputazione molto alta sembrano usare LINQ come professionisti.

Quindi la mia domanda è: per quale dominio problema dovrebbe essere usato LINQ?

Anche sulle note a margine: ci sono degli scopi in cui dovrebbe essere evitato? La dimensione del set di dati influisce sulle prestazioni delle query LINQ?




1
LINQ serve per interrogare i grafici degli oggetti. È una query integrata in lingua: consente di eseguire query e manipolare raccolte.
Oded,

1
è probabilmente una domanda chiudibile in quanto potrebbe esserci una buona domanda in agguato lì su quali problemi Linq è una buona soluzione per
jk.

1
Linq è dichiarativo. Dichiarate "cosa" volete senza specificare "come" è fatto. Per linq ciò significa che è possibile utilizzare una query per indicare ciò che si desidera. Il codice dichiarativo può essere più breve e più facile da comprendere per alcuni problemi.
mike30,

Risposte:


16

LINQ è progettato principalmente per consentire query e trasformazioni pure funzionali su sequenze di dati (noterai che tutte le estensioni LINQ accettano delegati Func ma non delegati Action). Di conseguenza, il caso più comune di un loop che non si adatta molto bene a LINQ è quello relativo agli effetti collaterali funzionali non puri, ad es.

foreach(var x in list) Console.WriteLine(x);

Per migliorare l'utilizzo di LINQ, esercitati a usarlo.

Ogni volta che stai per scrivere un foro un foreachciclo per fare qualcosa con una collezione, fermati, considera se è adatto a LINQ (cioè non sta semplicemente eseguendo un'azione / effetto collaterale sugli elementi), e in tal caso forzati a scrivere usando LINQ.

È inoltre possibile scrivere foreachprima la versione, quindi riscriverla in una versione LINQ.

Come svick sottolinea, LINQ dovrebbe mirare a rendere il tuo programma più leggibile. Di solito è bravo in questo in quanto tende a enfatizzare l'intento del codice piuttosto che il meccanismo; tuttavia, se scopri che non puoi rendere le tue query più leggibili di un semplice ciclo, sentiti libero di continuare con il ciclo.

Se hai bisogno di esercitazioni per esercitarti, la maggior parte degli esercizi di programmazione funzionale si associa perfettamente a LINQ, ad esempio 99 problemi (in particolare i primi 20 circa) o progetto euler .


Potrei dover eliminare questa domanda ora. Il moderatore ha commentato che non è adatto per la comunità. Se la pensi diversamente, per favore dimmelo.
user1816120

1
Aggiungo che se lo riscrivi in ​​LINQ e l'originale è ancora più leggibile, mantieni l'originale e rimuovi la versione LINQ. A volte, LINQ non aggiunge nulla.
svick,

@svick in teoria sì, non sono sicuro di poter pensare a qualche esempio di questo;)
jk.

1
@jk. Ad esempio, ReSharper a volte offre di convertire il mio loop in LINQ usando Aggregate(). Penso che la maggior parte delle volte, il ciclo sia più leggibile.
svick,

@svick probabilmente è un problema di ciò a cui sei abituato, anche se ammetto che aggregate è un nome goffo per fold
jk.

1

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.


Classifichi la mappa o pieghi come "query"? Non lo so, ma credo di poterlo vedere forse .. Normalmente penserei a un aggregato come risultato di un calcolo, non a una "query"
Jimmy Hoffa,

@JimmyHoffa Mi riferisco principalmente all'applicazione del calcolo alla raccolta sottostante, non necessariamente al calcolo stesso. Ma probabilmente ci sono buchi nella mia analogia, è pensato per essere illustrativo piuttosto che corretto al 100%.
Daniel B,

@JimmyHoffa no, ma non sono sicuro che esista una definizione rigorosa di come iniziare una query
jk.

0

Nel corso del tempo sono stati sviluppati linguaggi diversi per i vari tipi di origini dati, ad esempio SQL per database relazionali e XQuery per XML. Pertanto, gli sviluppatori hanno dovuto imparare un nuovo linguaggio di query per ogni tipo di origine dati o formato di dati che devono supportare. LINQ semplifica questa situazione offrendo un modello coerente per lavorare con i dati attraverso vari tipi di origini e formati di dati. In una query LINQ, lavori sempre con gli oggetti. per ulteriori informazioni, visitare http://msdn.microsoft.com/en-us/library/bb397906.aspx


LINQ è esattamente un'API di astrazione per lavorare con le raccolte. Alcuni importanti vantaggi: usando C # ottieni STATIC! Verifica delle tue richieste e trasformazioni
AndreasScheinert
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.