Per quale dominio problema è stato creato LINQ?

12

Ogni volta che vedo una domanda pubblicata su Stack Overflow su C #, vedo almeno una o due risposte pubblicate 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 si suppone che LINQ sia usato?

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

    
posta user1816120 05.02.2013 - 13:59
fonte

3 risposte

16

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

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

Per migliorare l'utilizzo di LINQ, è sufficiente esercitarlo.

Ogni volta che stai per scrivere un for o foreach loop per fare qualcosa con una collezione, fermati, considera se si adatta bene a LINQ (cioè non sta solo eseguendo un'azione / effetto collaterale sugli elementi ), e se è così costringiti a scriverlo usando LINQ.

Potresti anche scrivere la versione foreach prima di riscriverla a una versione LINQ.

Come sottolinea svick, LINQ dovrebbe rendere il tuo programma più leggibile. Di solito è buono perché tende a enfatizzare l'intento del codice piuttosto che il meccanismo; tuttavia, se non riesci a rendere le tue query più leggibili di un semplice ciclo, sentiti libero di seguire il ciclo.

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

    
risposta data 05.02.2013 - 14:16
fonte
1

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.

    
risposta data 06.02.2013 - 15:47
fonte
0

Diverse lingue sono state sviluppate nel tempo per i vari tipi di fonti di dati, ad esempio SQL per i database relazionali e XQuery per XML. Pertanto, gli sviluppatori hanno dovuto apprendere un nuovo linguaggio di query per ciascun 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 fonti e formati di dati. In una query LINQ, si lavora sempre con gli oggetti. per ulteriori informazioni visita link

    
risposta data 05.03.2013 - 06:54
fonte

Leggi altre domande sui tag